【发布时间】:2014-06-10 18:02:50
【问题描述】:
我在玩 CPS 和 Control.Monad.Cont,想知道我们通过注意到单子结构获得了什么。对于这样的代码:
sumOfSquares'cps :: Cont r Int -> Cont r Int -> Cont r Int
sumOfSquares'cps x y = x >>= \x' ->
y >>= \y' ->
return (x'*x' + y'*y')
可以很容易地改写为
type Cont' r a = (a -> r) -> r
sos'cps :: Cont' r Int -> Cont' r Int -> Cont' r Int
sos'cps x y = \k -> x $ \x' ->
y $ \y' ->
k (x'*x' + y'*y')
不要误会我的意思,但除了能够使用do 符号和newtype 之外,我看不到这里的感觉。我也不认为 callCC 依赖于 monad 实例。
我缺乏想象力来举一个例子。声明 Cont r 一个 monad 我们实际上得到了什么?
【问题讨论】:
-
“我认为
callCC也不依赖于 monad 实例”。严格来说,什么都不是。例如,在Maybemonadreturn = Just和(=<<) = maybe Nothing中。Monad类对预先存在的功能进行了抽象,以使 Michael Snoyman 在他的回答中提到的事情成为可能。 -
有道理,仔细想想。虽然通常当我看到使用 bind 重构的函数时,我的胃里会有一种舒适温暖的感觉,告诉我我做对了。我不明白
Cont,因为我猜在语法上没有真正的区别。 -
要了解为什么
Cont的语法糖看起来特别薄,您可能需要查看The Mother of all Monads。
标签: haskell monads continuation-passing