2010-04-17 7 views
10

Lo stato monadePerfezionamento monade "interfaccia" "interfaccia"

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

(+ ritorno e bind) permette di costruire ogni possibile calcolo con monade Stato senza utilizzare State costruttore. Ad esempio, State $ \s -> (s+1, s-1) può essere scritta come

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

Analogamente, non ho mai dovuto usare Reader costruttore, perché posso creare quel calcolo utilizzando ask, return e (>>=). Precisamente: Reader f == ask >>= return . f.

E 'lo stesso vale per continuazioni - è possibile scrivere tutte le istanze di Cont r a utilizzando callCC (l'unica funzione di MonadCont), tornare e si legano, e mai digitare qualcosa come Cont (\c -> ...)?

risposta

7

Non credo. Guardando i tipi:

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

Se avete solo callCC, non c'è uso di r come un tipo da nessuna parte - potrebbe essere di qualsiasi tipo. Quindi non so come si potrebbe tradurre qualcosa che lo utilizza come un tipo, ad esempio:

Cont (const 42) :: Cont Int a 

non ho modo di condizionare r se ho solo callCC.

Comunque, questa è la mia impressione. Non terribilmente rigoroso, ma sembra convincente.

+1

Tuttavia, mi aspetto queste modifiche se si dispone di continuazioni delimitate ... –