Eri*_*ric 6 haskell functional-programming category-theory
我大多是一个实用的人,但我发现这很有趣.
我一直在考虑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如果我能按顺序排序,为什么需要测序(.)?
Pet*_*lák 14
你走在正确的轨道上.每个monad都会产生所谓的Kleisli类别.对于每个monad,m其对应的Kleisli类别都有箭头a -> m b,它们可以使用> =>组成,其定义为
f >=> g = \x -> f x >>= g
Run Code Online (Sandbox Code Playgroud)
Kleisli类型在Haskell类型系统中封装它,你可以看到它有实例
instance Monad m => Category (Kleisli m) where
id = Kleisli return
(Kleisli f) . (Kleisli g) = Kleisli (g >=> f)
Run Code Online (Sandbox Code Playgroud)
因此,此类别中的排序计算只是使用排序操作>=>,可以使用等效表示>>=.
我们定义monad使用return,>>=因为它更方便,但我们也可以使用它来定义它们return,>=>如果我们想要的话.
(另请参阅我对不同方式查看monad的答案.)
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |