F. *_*Zer 3 haskell types type-inference applicative type-signature
我有这对函数
(,) <$> length :: Foldable t => t a -> b -> (Int, b)
Run Code Online (Sandbox Code Playgroud)
和,
head :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
我想了解的类型
(,) <$> length <*> head
Run Code Online (Sandbox Code Playgroud)
在(<*>) :: Applicative f => f (a -> b) -> f a -> f b
类型签名中,
f :: (->) [a]
a :: b
b :: (Int -> b)
因此,实例化类型将是:
(->) [a] (Int, b)
Run Code Online (Sandbox Code Playgroud)
但是,我发现它的类型确实是:
(->) [a] (Int, a)
Run Code Online (Sandbox Code Playgroud)
两个问题,如果可以的话:
b
切换为a
?让我们继续使用签名
(,) <$> length :: Foldable t => t a -> b -> (Int, b)
Run Code Online (Sandbox Code Playgroud)
但改变
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
到
(<*>) :: Applicative f => f (x -> y) -> f x -> f y
Run Code Online (Sandbox Code Playgroud)
所以它不会让人困惑。很明显f ~ (->) [a]
(假设我们正在使用 foldable 的列表实例),正如您所注意到的,因此x -> y ~ b -> (Int, b)
、 所以x ~ b
和y ~ (Int, b)
。这是您错过的部分,可能是由于命名混乱:第二个参数是f x
or [a] -> b
,而您传入的是head
,即[a] -> a
. 这会强制 b
变为与 相同a
,否则类型将无法解决。结果是f y
, or [a] -> (Int, b)
,除了b
now a
,给你[a] -> (Int, a)
签名。
归档时间: |
|
查看次数: |
123 次 |
最近记录: |