2010-04-17 6 views
10

Der Zustand monadisch "interface"Continuation monadisch "Schnittstelle"

class MonadState s m where 
    get :: m s 
    put :: s -> m() 

(+ Rückkehr und bind) ermöglicht, mit monadisch Staat eine mögliche Berechnung zu konstruieren, ohne State Konstruktor. Zum Beispiel State $ \s -> (s+1, s-1) als

do s <- get 
    put (s-1) 
    return (s+1) 

ähnlich geschrieben werden, ich habe nie Reader Konstruktor verwenden, da ich diese Berechnung erstellen ask, return und (>>=) verwenden. Genau: Reader f == ask >>= return . f.

Ist es das gleiche gilt für die Fortsetzungen - ist es möglich, alle Instanzen von Cont r a mit callCC (der einzigen Funktion in MonadCont) einzutragen, zurückzukehren und zu binden, und nie so etwas wie Cont (\c -> ...) geben?

Antwort

7

Ich glaube nicht. Mit Blick auf den Typen:

Cont :: ((a -> r) -> r) -> Cont r a 
callCC :: ((a -> Cont r b) -> Cont r a) -> Cont r a 

Wenn Sie nur callCC haben, gibt es keine Verwendung von r als eine Art überall - es irgendwelcher Art sein könnte. Also ich weiß nicht, wie man etwas übersetzen könnte, die es als eine Art verwendet, zum Beispiel:

Cont (const 42) :: Cont Int a 

ich keine Möglichkeit habe r von Zwang wenn ich callCC nur haben.

Wie auch immer, das ist meine Ahnung. Nicht sehr streng, aber es scheint überzeugend.

+1

Ich erwarte jedoch, dass sich das ändert, wenn Sie Fortsetzungen begrenzt haben ... –