2017-04-09 8 views
0

私は、与えられた変数の値のための保存機能をシミュレートしようとしています。最初は空の領域を作成し、変数の値を追加する場合は、この変数の更新をこの保存領域で行います。可変バレルシミュレータを保存

私は、複数の領域を節約でき、独自の変数値を持つことができるようにしたいと考えています。

私は次のコード

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 
+0

'sv'、ない'のinit v':古い店sに沿って、それを渡すために)今、それは限り、あなたはどの店変数名を再利用していないとして、動作します。 '' s''が使用されていないことを警告するために-Wallをオンにします。あなたのアイデアを保存するこの方法でしたか? – Gurkenglas

+1

http://stackoverflow.com/questions/993124/does-haskell-have-variables – suchtgott

+0

GHCiで 's2'を再帰関数として再定義しています。あなたは明らかにそれをするつもりはありません。代わりに 's1 = init;を試してください。 s2 =更新s1 "x" 10; s3 =更新s2 "y" 30; s4 =毎回異なる変数を用いてs3 "z" 50を更新する。 – chi

答えて

0

、あなたは実際には二つの問題があります。右側のs2s2の「古い」値ではありません

let s2 = ... something that includes s2 ... 

:あなたは、このためのような式である道「S2」を再利用することはできません。代わりに、あなたが定義している新しいs2への再帰的参照です。あなたのコードが正しい場合、これは無限ループを引き起こしますが、2番目のバグがあります。 update関数はinitに新しい変数定義を追加し、以前のストアsを提供しないため、何も更新せず、古いsを使用することはありません。代わりに、あなたのupdate次のように再定義:

update :: Store -> Variable -> Val -> Store 
update s v val = (\x -> if x == v then val else s x) 

(あなたがいないs vs xを望んでいることに注意してください - xはあなたがルックアップするためにしようとしている変数であり、そしてそれはvと一致しない場合、その後、あなたがしたいです。

*Main> s1 = Main.init -- use "Main." to avoid conflict w/ Prelude.init 
*Main> s2 = update s1 "x" 10 
*Main> s3 = update s2 "y" 30 
*Main> fetch s3 "x" 
10 
*Main> fetch s3 "y" 
30 
*Main> 
+0

ありがとうございます。あなたは私のヒーローです! – Jordi

関連する問題