我正在玩 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我们实际上得到了什么?