我主要是一个实用的人,但我发现这很有趣。
我一直在考虑monadic测序,还有一些 我需要澄清的事情。所以冒这里听起来很傻的风险 它是:
monadic成员绑定
bind :: m b -> (b -> m c) -> m c
可以对“操作”进行排序,使您可以显式访问中间值。
这比分类成员(.)
给我的更多:
(.) :: cat b c -> cat a b -> cat a c
有了这个,我可以排序并获得对中间值的访问权限。
毕竟(f . g) x = f(g (x))
。
如果我可以使用bind
进行排序,为什么需要(.)
进行排序?
答案 0 :(得分:14)
你走在正确的轨道上。每个monad都会产生所谓的Kleisli category。对于每个monad m
,其对应的Kleisli类别都有箭头a -> m b
,并且可以使用>=>来组合,其定义为
f >=> g = \x -> f x >>= g
Kleisli类型在Haskell类型系统中封装了这个,你可以看到它有实例
instance Monad m => Category (Kleisli m) where
id = Kleisli return
(Kleisli f) . (Kleisli g) = Kleisli (g >=> f)
因此,此类别中的排序计算只是使用>=>
排序操作,可以使用>>=
等效地表示。
我们使用return
和>>=
定义monad,因为它更方便,但如果需要,我们也可以使用return
和>=>
来定义它们。