我是 Haskell 初学者,我仍在学习范畴论及其在计算机科学中的实际应用。
昨天我看了伯克利大学关于范畴论的几场讲座,它的大部分内容都展示了环、半群、群、岩浆、幺半群等的数学视图。
因此,我脑海中提出了关于一元组合和 kleisli 范畴的问题。因此,我想向 Haskell/Category Theory 专家提问。
do符号是一种单子组合吗?
问候,
巴勃罗·帕拉达
我是 Haskell 初学者,我仍在学习范畴论及其在计算机科学中的实际应用。
昨天我看了伯克利大学关于范畴论的几场讲座,它的大部分内容都展示了环、半群、群、岩浆、幺半群等的数学视图。
因此,我脑海中提出了关于一元组合和 kleisli 范畴的问题。因此,我想向 Haskell/Category Theory 专家提问。
do符号是一种单子组合吗?
问候,
巴勃罗·帕拉达
do符号是一种单子组合吗?
do 表示法没有什么特别之处。它只是 monad 函数的语法糖。来自 Haskell wikibook 的一个很好的例子:
do x1 <- action1
x2 <- action2
action3 x1 x2
脱糖:
action1
>>=
\ x1 -> action2
>>=
\ x2 -> action3 x1 x2
真实世界的 Haskell 书中有一个很好的部分解释了这种脱糖是如何在各种情况下发生的。
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
两种呈现方式是等价的。确实,unit
和return
都是一回事。相反,join
可以用(>>=)
如下方式表示
join x = x >>= id
反之亦然,(>>=)
可以用 来表示join
。
x >>= f = join (fmap f x)
上面注意fmap
takea -> m b
和m a
to return m (m b)
,然后将其展平为m b
by join
。