Haskell 如何计算复合遍历的类型?

Haskell 如何计算复合遍历的类型?,haskell,haskell-lens,lenses,Haskell,Haskell Lens,Lenses,我跟在后面。在它里面,有一个 traverse.posts 它以类型结束 (Traversable t, Applicative f) => ([Post] -> f [Post]) -> t User -> f (t User) 我知道这是函数组合,但我有点困惑它是如何以这种类型结束的 有人能帮我解决这个问题吗?我们有以下类型的函数: traverse :: (Applicative f, Traversable t) => (a -> f b)

我跟在后面。在它里面,有一个

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
让我们把
travel
posts
(按顺序)的类型排成一行,这样我们就可以看到发生了什么(我将省略类型类约束),并在函数结果周围添加隐含的括号(
a->b->c
a->(b->c)
的快捷方式)

从这里我们可以看到,
a~User
b~User
~
这里的意思是“标识为”或“等于”),所以让我们专门遍历并再次写下函数的类型:

                        (User ->   f User) -> (t User -> f (t User))
([Post] -> f [Post]) -> (User ->   f User)
由此我们可以看出,组合将具有类型(现在再次省略约束)

或者不带可选括号

([Post] -> f [Post]) -> t User -> f (t User)
那么约束条件呢?使用
posts
给了我们
函子f
约束,
travel
给了我们
Applicative f
travelable t
,但是因为
Applicative
函子的一个子类(它被定义为
类函子f=>Applicative f其中--
),我们不必指定
函子f
约束,它已经存在了

因此,我们只剩下:

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