Do 表示法和 Monad 组合

Do notation and Monad composition

我是 Haskell 初学者,我仍在学习范畴论及其在计算机科学中的实际应用。

我昨天看了伯克利大学关于范畴论的几个讲座,其中大部分内容展示了 Rings、Semigroups、Groups、Magmas、Monoids 等的数学观点。

因此,我想到了关于monadic composition和kleisli category的问题。所以想向Haskell/Category理论高手提问。

do 表示法是一种 monad 组合吗?

此致,

巴勃罗·帕拉达

Is do notation a sort of monad composition?

do 表示法没有什么特别之处。它只是 monad 函数的语法糖。来自 Haskell wikibook 的一个很好的例子:

do x1 <- action1
   x2 <- action2
   action3 x1 x2

脱糖为:

action1
  >>=
    \ x1 -> action2
      >>=
        \ x2 -> action3 x1 x2

现实世界 haskell 书中有一个很好的部分解释了这种 de-sugaring 如何在各种场景中发生。

Do 符号只是 >>= 的语法糖。代码如

do x <- a
   b  -- b is an expression possibly involving x

脱糖为

a >>= \x -> b

如果您正在研究 CT 中的单子,您可能会发现它们被定义为具有两个自然变换的函子

unit :: a -> m a        -- also known as η
join :: m (m a) -> m a  -- also known as μ

而 Haskell 定义

return :: a -> m a
(>>=)  :: m a -> (a -> m b) -> m b

两种表述方式是等价的。事实上,unitreturn 是完全一样的东西。相反,join 可以用 (>>=) 表示如下

join x = x >>= id

反之亦然,(>>=) 可以表示为 join

x >>= f = join (fmap f x)

上面注意到 fmap 需要 a -> m bm a 到 return m (m b),然后 m b 被压扁为 m b 19=].