我是Haskell的初学者,我还在学习类别理论及其在计算机科学中的实际应用。
我花了最后一天观看伯克利大学关于范畴理论的几次讲座,其中大部分内容都是关于戒指,半群,群体,幻马,幺半群等的数学观点。
因此,在我的脑海中提出了关于monadic组合和kleisli类别的问题。因此,我想问一下Haskell / Category Theory专家。
记法是一种单子构图吗?
此致
巴勃罗·帕拉达答案 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
两个演示文稿都是等同的。实际上,unit
和return
完全相同。相反,join
可以用(>>=)
表示如下
join x = x >>= id
,反之亦然,(>>=)
可以用join
表示。
x >>= f = join (fmap f x)
请注意,fmap
需要a -> m b
和m a
返回m (m b)
,然后m b
将其展平为join
。