做符号和Monad组成

时间:2015-03-01 23:31:27

标签: haskell category-theory abstract-algebra

我是Haskell的初学者,我还在学习类别理论及其在计算机科学中的实际应用。

我花了最后一天观看伯克利大学关于范畴理论的几次讲座,其中大部分内容都是关于戒指,半群,群体,幻马,幺半群等的数学观点。

因此,在我的脑海中提出了关于monadic组合和kleisli类别的问题。因此,我想问一下Haskell / Category Theory专家。

记法是一种单子构图吗?

此致

巴勃罗·帕拉达

2 个答案:

答案 0 :(得分:8)

  

记法是一种单子构图吗?

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

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

去糖:

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

真实世界的haskell书有一个很好的部分解释了de-sugaring在各种情况下如何发生。

答案 1 :(得分:4)

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

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)

请注意,fmap需要a -> m bm a返回m (m b),然后m b将其展平为join