2012-03-14 16 views
12

私はLearn You a Haskell's guide on the state monadを読んでいましたが、スタックの例がコンパイルできなかったので、理解できませんでした。私はそれを行うことになっているものを理解しますが、それはコンパイルされません状態モナドと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) 

:ガイドでは、彼は次のコードを使用していました。なぜ私は考えていない。エラーメッセージは次のとおりです。「国家」であるので、

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

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

これは、私には意味がありません、私の知る限り、実際に

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

として定義されたデータコンストラクタは、「間違っている」ガイドですもしそうなら、私はそれをどのように修正するのですか?

+5

'Control.Monad.State'は' State'コンストラクタをエクスポートせず、 'state'(小文字の' s')を使用します。 – Vitus

+0

@Vitusニース、私は[その機能](http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-Trans-State-Lazy.html#v)を知らなかった:州)が輸出されました。私はあなたがコメントではなく答えとして書くべきだと思う。 – danr

+0

@Vitus:彼のコードは実際にコンパイルされ、WindowsのGHCI 6.12.3でうまく動作するので、それは奇妙です。 –

答えて

18

コメントに記載されているとおり、Stateの代わりにstateを使用する必要があります。


問題はStateスタンドアロンデータ型(またはむしろnewtype)ではないということであるが、それはIdentityモナドに適用StateT変圧器です。実際には、

type State s = StateT s Indentity 

として定義されていますし、それだけでtype同義語だから、それはStateコンストラクタを持つことができません。そのため、Control.Monad.Statestateを使用しています。

+0

これは今コンパイルされています。 – Undreren

+0

これはもう機能しません。誰かが正しい構文を知っていますか? –

関連する問題