如何确定复合遍历的类型?
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
让我们排列 traverse
和 posts
的类型(按此顺序),这样我们就可以看到发生了什么(我将省略 type-class 约束), 让我们在函数的结果周围添加隐含的括号(a -> b -> c
是 a -> (b -> c)
的快捷方式)
(a -> f b ) -> (t a -> f (t b))
([Post] -> f [Post]) -> (User -> f User)
由此可见a ~ User
、b ~ 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 f
和 Traversable 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)
我正在关注 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
让我们排列 traverse
和 posts
的类型(按此顺序),这样我们就可以看到发生了什么(我将省略 type-class 约束), 让我们在函数的结果周围添加隐含的括号(a -> b -> c
是 a -> (b -> c)
的快捷方式)
(a -> f b ) -> (t a -> f (t b))
([Post] -> f [Post]) -> (User -> f User)
由此可见a ~ User
、b ~ 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 f
和 Traversable 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)