繁体   English   中英

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

[英]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

让我们按顺序排列traverseposts的类型,以便我们能看到发生了什么(为此我将省略类型类约束),并在函数的结果周围添加隐式括号( a -> b -> c是a a -> (b -> c)的快捷方式

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

从中我们可以看到a ~ Userb ~ 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 fTraversable t ,但是因为ApplicativeFunctor的子类(定义为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM