理解功能编程中的排序

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的答案.)

  • 我正在打字但是你打败了我,所以我只想补充一点,Monad法则相当于使"Kleisli m"成为一个类别的法则:左右吸收身份,以及组合的相关性.另请注意,`ArrowApply`定义了一个额外的结构,`Arrow`必须产生一个monad.`Kleisli m`不仅仅是一个类别,而是一个'箭头',当然还拥有额外的'ArrowApply`结构,但不是所有的'箭头'. (4认同)