4

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

昨天我看了伯克利大学关于范畴论的几场讲座,它的大部分内容都展示了环、半群、群、岩浆、幺半群等的数学视图。

因此,我脑海中提出了关于一元组合和 kleisli 范畴的问题。因此,我想向 Haskell/Category Theory 专家提问。

do符号是一种单子组合吗?

问候,

巴勃罗·帕拉达

4

2 回答 2

10

do符号是一种单子组合吗?

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

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

脱糖:

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

真实世界的 Haskell 书中有一个很好的部分解释了这种脱糖是如何在各种情况下发生的。

于 2015-03-01T23:38:02.043 回答
4

Do 表示法只是>>=. 代码如

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

被脱糖

a >>= \x -> b

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

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)

上面注意fmaptakea -> m bm ato return m (m b),然后将其展平为m bby join

于 2015-03-02T09:07:13.583 回答