2010-04-17 28 views
10

durum tek hücreli "arayüz"devam atom "arayüz"

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

(+ dönüş ve bağlama) State yapıcı kullanmadan Devlet monadın ile muhtemel bir hesaplama kurulmasına olanak sağlar. Örneğin, State $ \s -> (s+1, s-1) ben ask, return ve (>>=) kullanarak bu hesaplama oluşturabilir çünkü Reader yapıcı kullanmak zorunda asla

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

Benzer şekilde olarak yazılabilir. Kesinlikle: Reader f == ask >>= return . f.

o continuations için aynı doğru mudur - bu dönüp bağlamak, ( MonadCont tek işlevi) callCC kullanılarak Cont r a tüm örneklerini yazma ve Cont (\c -> ...) gibi bir şey yazın asla mümkün mü?

cevap

7

Sanırım öyle değil. türleri baktığımızda: Sadece callCC varsa

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

, her yerde bir türü olarak r hiçbir faydası yoktur - bu her türlü olabilir. Sadece callCC varsa

Cont (const 42) :: Cont Int a 

Ben r kısıtlayıcı yolu yok: Bu yüzden örneğin bir türü olarak kullanır şey, tercüme nasıl bilmiyorum. Her neyse, bu benim önsezimdir. Çok sert değil, ama ikna edici görünüyor.

+1

Ancak, sürekliliği sınırlandırırsanız bu değişiklikleri beklerim ... –