2016-09-17 7 views
3

私はHaskellの評価者をシミュレートしています。シンプルなはずですが、デバッグできませんでした。評価者をシミュレートします

type State = String -> Int 

extend :: State -> String -> Int -> State 
extend base key val = \x -> if key == x 
           then val 
           else base key 

empty :: State 
empty = \x -> 0 
base環境に

Iは、ルックアップ機能( String -> Int)、初期状態( emptyは、例外変数が 0を評価)として Stateを定義ここで

、およびextendは、新しいキーを追加します(そして、それは値です)

aState = extend empty "A" 5 
bState = extend aState "B" 4 
cState = extend bState "C" 3 

私はcState機能と同等でなければならないこととします:

は、私はプログラムをテストするとき

\x -> if x == "C" 
      then 3 
      else if x == "B" 
        then 4 
        else if x == "A" 
          then 5 
          else 0 

代わりに、cState "B" == 0cState "A" == 0が得られます。

私はextendで何が問題なのか分かりませんが、誰かが私に説明できますか?

答えて

6

elseステートメントでは、すべての再帰でkeyxではなく)を検索します。else base keyでそれを修正:

extend :: State -> String -> Int -> State 
extend base key val = \x -> if key == x 
           then val 
           else base x 

ところで、あなたが書くかもしれない:

empty :: State 
empty = \_ -> 0 

入力に関わらずempty復帰0以来。

関連する問題