(.)
和(<=<)
非常相似:
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)
并且可以作为 Category
中的方法使用类型类( (->)
和 Kleisli
实例):
(<<<) :: (Category f) => f b c -> f a b -> f a c
($)
和(=<<)
也很相似:
($) :: (a -> b) -> a -> b
(=<<) :: Monad m => (a -> m b) -> m a -> m b
是否有一个类型类可以抽象这些应用程序函数?
最佳答案
正如丹尼尔的评论所说,(=<<)
已经包含($)
。 Kleisli
已经有一个 newtype (类似于 a -> m b
newtype for Category
for a
)叫 Identity
,其中有 Monad
实例使得
f $ x
对应
Identity . f =<< Identity x
虽然(.)
中有重复使用的子组件和(<=<)
(即前者的 a -> b
和后者的 a -> m b
)可以抽象为类型构造函数 a :: * -> * -> *
的类型类。 (结果是 Category
), ($)
中最大的此类子组件和(=<<)
只是 a
在前者和 m a
在后者中。
关于haskell - 函数和克莱斯利箭头的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40065480/