我玩弄CPS和Control.Monad.Cont
,并想知道我们通过注意monadic结构获得什么。对于这样的代码:Cont的monad实例有什么好处?
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实例”。严格地说,从来没有。例如,在Maybe'monad'return = Just'和'(= <<)=也许Nothing'中。 Monad类抽象出先前存在的功能,以使Michael Snoyman在他的回答中提到的可能性。 – duplode
有意思,思考一下。虽然通常当我看到使用绑定的重构函数时,我在我的胃里感受到一种温暖的温暖感觉,这告诉我我做了正确的事情。我不明白'Cont',因为在语法上我没有真正的区别。 –
要理解为什么句法糖对于'Cont'看起来特别薄,你可能想查看[The Monads of Monads](http://blog.sigfpe.com/2008/12/mother-of-all- monads.html)。 –