6

我主要是一个实际的人,但我觉得这很有趣。

我一直在考虑单子排序,有一些事情我需要澄清。因此,冒着听起来很傻的风险,它是:

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排序(.)

4

1 回答 1

14

你在正确的轨道上。每个 monad 都会产生所谓的Kleisli 范畴。对于每个 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我们使用and来定义 monad ,因为它更方便,但是如果我们愿意,我们也可以使用and>>=来定义它们。return>=>

(另请参阅我对查看 monad的不同方式的回答。)

于 2012-10-13T20:24:29.787 回答