如何确定复合遍历的类型?

How can the type of a composite Traversal be worked out?

我正在关注 a blog post on lens' traversals。里面有

的组成
traverse.posts

它以类型

结尾
(Traversable t, Applicative f) => 
   ([Post] -> f [Post]) -> t User -> f (t User)

我知道它是函数组合。但我对它如何以这种类型结束感到有点困惑。

谁能帮我解决这个问题?

我们有以下类型的功能:

traverse :: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
posts :: Functor f => ([Post] -> f [Post]) -> User -> f User

让我们排列 traverseposts 的类型(按此顺序),这样我们就可以看到发生了什么(我将省略 type-class 约束), 让我们在函数的结果周围添加隐含的括号(a -> b -> ca -> (b -> c) 的快捷方式)

                        (a    ->   f b   ) -> (t a -> f (t b))
([Post] -> f [Post]) -> (User ->   f User)

由此可见a ~ Userb ~ User(这里的~表示'is identified with',或者'is equal to'),所以我们专门遍历写再次记下函数的类型:

                        (User ->   f User) -> (t User -> f (t User))
([Post] -> f [Post]) -> (User ->   f User)

从这里我们可以看出组合将具有类型(现在再次省略约束)

([Post] -> f [Post]) ->                       (t User -> f (t User))

或不带可选括号

([Post] -> f [Post]) -> t User -> f (t User)

那么约束呢? posts 的使用给了我们 Functor f 约束,而 traverse 给了我们 Applicative fTraversable t,但是因为 Applicative 是一个子- Functor 的 class(定义为 class Functor f => Applicative f where -- ...),我们不必指定 Functor f 约束,它已经存在了。

所以我们剩下:

traverse . posts :: (Applicative f, Traversable t) => 
                    ([Post] -> f [Post]) -> t User -> f (t User)