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)