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
两种表述方式是等价的。事实上,unit
和 return
是完全一样的东西。相反,join
可以用 (>>=)
表示如下
join x = x >>= id
反之亦然,(>>=)
可以表示为 join
。
x >>= f = join (fmap f x)
上面注意到 fmap
需要 a -> m b
和 m a
到 return m (m b)
,然后 m b
被压扁为 m b
19=].
我是 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
两种表述方式是等价的。事实上,unit
和 return
是完全一样的东西。相反,join
可以用 (>>=)
表示如下
join x = x >>= id
反之亦然,(>>=)
可以表示为 join
。
x >>= f = join (fmap f x)
上面注意到 fmap
需要 a -> m b
和 m a
到 return m (m b)
,然后 m b
被压扁为 m b
19=].