2010-04-17 41 views
10

狀態單子「接口」續單子「接口」

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

(+返回和結合)允許構建具有國家單子任何可能的計算,而不使用State構造。例如,State $ \s -> (s+1, s-1)可以寫成

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

相若方式,我從來沒有使用Reader構造,因爲我可以創建使用askreturn(>>=)該計算。準確地說:Reader f == ask >>= return . f

是不是同一真正的延續 - 這可能(在MonadCont的唯一功能)使用callCC寫的Cont r a所有實例,返回和綁定,永不鍵入類似Cont (\c -> ...)

回答

7

我不這麼認爲。縱觀類型:

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

如果你只有callCC,沒有用的r作爲一種在任何地方 - 它可以是任何類型的。所以,我不知道你怎麼能翻譯的東西,把它作爲一個類型,例如:我沒有約束r的方式

Cont (const 42) :: Cont Int a 

如果我只有callCC

無論如何,這是我的直覺。不是非常嚴格,但它似乎有說服力。

+1

但是,如果您有分隔延續,我預計會發生這種變化...... – 2010-04-18 13:21:40