理解功能编程中的排序

时间:2012-10-13 20:01:44

标签: 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进行排序,为什么需要(.)进行排序?

1 个答案:

答案 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>=>来定义它们。

(另请参阅my answerDifferent ways to see a monad。)