2010-04-17 17 views
10

El estadoContinuación mónada "interfaz" mónada "interfaz"

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

(+ retorno y bind) permite construir cualquier posible cálculo con mónada Estado sin utilizar State constructor. Por ejemplo, State $ \s -> (s+1, s-1) se puede escribir como

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

Similarmente, no tengo que usar Reader constructor, porque puedo crear ese cálculo utilizando ask, return y (>>=). Precisamente: Reader f == ask >>= return . f.

¿Es lo mismo ocurre con las continuaciones - es posible escribir todos los casos de uso de Cont r acallCC (la única función en MonadCont), el retorno y se unen, y nunca escribir algo así como Cont (\c -> ...)?

Respuesta

7

No lo creo. Mirando a los tipos:

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

Si sólo tiene callCC, no hay uso de r como un tipo en cualquier lugar - que podría ser de cualquier tipo. Así que no sé cómo se podría traducir algo que lo utiliza como un tipo, por ejemplo:

Cont (const 42) :: Cont Int a 

no tengo manera de limitar r si sólo tengo callCC.

De todos modos, esa es mi corazonada. No es terriblemente riguroso, pero parece convincente.

+1

Sin embargo, espero que esto cambie si tiene continuaciones delimitadas ... –