我玩弄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)。 –