Sto giocando con CPS e Control.Monad.Cont
e mi chiedo cosa guadagniamo notando la struttura monadica. Per il codice come questo:A che serve l'istanza monad di 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')
possono facilmente essere riscritta come
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')
Non fraintendetemi, ma non riesco a vedere la sensazione qui oltre ad essere in grado di utilizzare do
notazione e un newtype
. Non penso che callCC
dipenda dall'istanza monad.
Mi manca l'immaginazione per fare un esempio. Cosa otteniamo in realtà per dichiarare una monade Cont r
?
"Non penso che' callCC' dipenda dall'istanza monad ". A rigor di termini, nulla lo è mai. Ad esempio, nel 'Maybe' monad' return = Just' e '(= <<) = forse Nothing'. La classe 'Monad' astra di funzionalità preesistenti per rendere le cose che Michael Snoyman accenna nella sua risposta possibile. – duplode
Ha senso, dopo averci pensato. Anche se normalmente quando vedo le funzioni refactored usando il binding, ottengo una sensazione calda e accogliente nello stomaco che mi dice che ho fatto la cosa giusta. Non capisco per 'Cont', perché non c'è alcuna differenza reale nella sintassi, immagino. –
Per capire perché lo zucchero sintattico sembra così particolarmente sottile per 'Cont', potresti voler controllare [La madre di tutte le monadi] (http://blog.sigfpe.com/2008/12/mother-of-all- monads.html). –