2012-03-14 21 views
12

Ben Learn You a Haskell's guide on the state monad okuyordum ama sorun derlemek olamazdı yığın örnek beri anlamakta vardı. Ben bunu yapmak için gerekeni anlıyor olmakla birlikte, derlemek olmazdevlet monad ve learnyouahaskell.com

import Control.Monad.State 

type Stack = [Int] 

pop :: State Stack Int 
pop = State $ \(x:xs) -> (x,xs) 

push :: Int -> State Stack() 
push a = State $ \xs -> ((),a:xs) 

: kılavuzda, o aşağıdaki kod parçasını kullandı. Neden olduğuna dair hiçbir fikrim yok. Hata iletisi: Bu aslında, bildiğim kadarıyla, bir "Devlet" beri bana

newtype State s a = State { runState :: s -> (a,s) } 

olarak tanımlanan bir veri yapıcısı, hiç mantıklı rehber "yanlış" mı

Stack.hs:6:7: Not in scope: data constructor `State' 

Stack.hs:9:10: Not in scope: data constructor `State' 

ve eğer öyleyse, nasıl düzeltebilirim? Ben yorumlarında belirtildiği gibi

+5

'Control.Monad.State',' State' kurucu dışa (küçük harf 'S'ye sahip)' state' kullanmaz. – Vitus

+0

@Vitus Güzel, bilmiyordum [o fonksiyonu] (http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-Trans-State-Lazy.html#v : devlet) ihraç edildi. Bence bir yorumdan ziyade bir cevap olarak yazmalısın. – danr

+0

@Vitus: o zaman garip, çünkü onun kodu gerçekten Windows'ta GHCI 6.12.3'ümde iyi çalışıyor ve çalışıyor. –

cevap

18

, sen state yerine State kullanmalisin.


sorun State bağımsız veri tipi (ya da daha doğrusu newtype) değildir, ancak Identity monadın uygulanan StateT transformatörüdür. Aslında

type State s = StateT s Indentity 

olarak tanımladı ve sadece type eşanlamlı çünkü, bu State yapıcı olamaz. Bu nedenle Control.Monad.State, state kullanıyor.

+0

Şimdi derler :) Büyük, teşekkürler! – Undreren

+0

Artık çalışmıyor. Doğru sözdizimini bilen var mı? –