2010-04-17 5 views
10

L'état monade « Interface »Suite monade « Interface »

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

(+ retour et se lient) permet de construire tout calcul possible avec monade de l'Etat sans utiliser constructeur State. Par exemple, State $ \s -> (s+1, s-1) peut être écrit comme

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

Similairement, je ne dois utiliser Reader constructeur, parce que je peux créer ce calcul en utilisant ask, return et (>>=). Précisément: Reader f == ask >>= return . f.

Est-il vrai même pour les continuations - est-il possible d'écrire toutes les instances de Cont r a en utilisant callCC (la seule fonction MonadCont), le retour et se lient, et ne jamais taper quelque chose comme Cont (\c -> ...)?

Répondre

7

Je ne pense pas. En regardant les types:

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

Si vous n'avez callCC, il n'y a pas d'utilisation de r comme un type partout - il pourrait être de toute nature. Je ne sais pas comment vous pourriez traduire quelque chose qui l'utilise comme un type, par exemple:

Cont (const 42) :: Cont Int a 

Je n'ai aucun moyen de contraindre r si je ne callCC.

De toute façon, c'est mon intuition. Pas très rigoureux, mais ça semble convaincant.

+1

Cependant, je m'attends à ce que cela change si vous avez des suites délimitées ... –