[英]How can the type of a composite Traversal be worked out?
我正在关注有关镜头遍历的博客文章 。 其中有一个组成
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
让我们按顺序排列traverse
和posts
的类型,以便我们能看到发生了什么(为此我将省略类型类约束),并在函数的结果周围添加隐式括号( a -> b -> c
是a a -> (b -> c)
的快捷方式
(a -> f b ) -> (t a -> f (t b))
([Post] -> f [Post]) -> (User -> f User)
从中我们可以看到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))
或不带可选括号
([Post] -> f [Post]) -> t User -> f (t User)
现在约束如何? 好吧, posts
的使用给了我们Functor f
约束, traverse
给了我们Applicative f
和Traversable t
,但是因为Applicative
是Functor
的子类(定义为class Functor f => Applicative f where -- ...
) ,我们不必指定Functor f
约束,因为它已经存在。
所以我们剩下:
traverse . posts :: (Applicative f, Traversable t) =>
([Post] -> f [Post]) -> t User -> f (t User)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.