使用遍历实现sequenceA

时间:2017-06-10 13:09:43

标签: haskell types

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在哪里?

1 个答案:

答案 0 :(得分:4)

首先让我们说id的类型为id :: c -> c,以使更简单。函数类型签名中的a local ,因为a的{​​{1}} 没有 id :: a -> a中的atraverse :: 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