私は、与えられた変数の値のための保存機能をシミュレートしようとしています。最初は空の領域を作成し、変数の値を追加する場合は、この変数の更新をこの保存領域で行います。可変バレルシミュレータを保存
私は、複数の領域を節約でき、独自の変数値を持つことができるようにしたいと考えています。
私は次のコード
type Variable = String
type Val = Int
type Store = Variable -> Val
init :: Store
init = (\x -> 0)
fetch :: Store -> Variable ->Val
fetch store variable = store variable
update :: Store -> Variable -> Val -> Store
update s v val = (\x -> if x == v then val else init v)
を持っていると私が作る実行はこれです:
> Main> s1 = init
> *Main> s2 = update s1 "x" 10
> *Main> s2 = update s2 "y" 30
> *Main> fetch s2 "x"
0
> *Main> fetch s2 "y"
30
> *Main>
ので、ここでの問題は、機能更新がすべての変数の値を「節約」しないということです、最後の1つだけ。
正しいexcutionはこのようになります:コメントで指摘したように
> Main> s1 = init
> *Main> s2 = update s1 "x" 10
> *Main> s2 = update s2 "y" 30
> *Main> s2 = update s2 "z" 50
> *Main> fetch s2 "x"
10
> *Main> fetch s2 "y"
30
> *Main> fetch s2 "z"
50
> *Main> fetch s2 "w"
0
'sv'、ない'のinit v':古い店
s
に沿って、それを渡すために)今、それは限り、あなたはどの店変数名を再利用していないとして、動作します。 '' s''が使用されていないことを警告するために-Wallをオンにします。あなたのアイデアを保存するこの方法でしたか? – Gurkenglashttp://stackoverflow.com/questions/993124/does-haskell-have-variables – suchtgott
GHCiで 's2'を再帰関数として再定義しています。あなたは明らかにそれをするつもりはありません。代わりに 's1 = init;を試してください。 s2 =更新s1 "x" 10; s3 =更新s2 "y" 30; s4 =毎回異なる変数を用いてs3 "z" 50を更新する。 – chi