sequenceA在Data.Traversable
中实现如下 sequenceA :: Applicative f => t (f a) -> f (t a)
sequenceA = traverse id
我无法理解traverse id
的类型。 traverse
的类型为:traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
其第一个参数的类型为:(a -> f b)
但在sequenceA
的情况下,id函数的类型为(a -> a)
。 f在哪里?
答案 0 :(得分:4)
首先让我们说id
的类型为id :: c -> c
,以使更简单。函数类型签名中的a
是 local ,因为a
的{{1}} 没有与 id :: a -> a
中的a
。 traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
只是一个类型参数。
现在我们有了表达式:
a
使用:
traverse id
我在traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
id :: c -> c
部分的相同列中编写了c -> c
部分,以显示Haskell类型系统如何交互。它现在得出:
a -> f b
这意味着a ~ c
f b ~ c
和类型相等,因为每个相等关系都是传递,因此它也意味着a ~ c ~ f b
。所以现在Haskell将a ~ f b
专门化为:
traverse id
因此类型。 traverse id :: Applicative f => t a -> f (t b)
traverse id :: Applicative f => t (f b) -> f (t b) -- a ~ f b
中的id
类型的类型为traverse id
。