2016-09-17 3 views
3

Ich simuliere einen Evaluator mit Haskell. Es sollte einfach sein, aber ich konnte nicht debuggen.Einen Evaluator simulieren

Here I State als Look-up-Funktion definieren (String -> Int), einem Anfangszustand (empty, Ausnahmevariable auswertet 0) und extend zu neuen Schlüssel hinzuzufügen (und es ist Wert) zu einer base Umgebung:

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 

, wenn ich das Programm testen:

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

ich nehme an, dass cState auf eine Funktion gleichwertig sein soll:

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

Aber stattdessen ich cState "B" == 0 und cState "A" == 0.

Ich kann nicht sehen, was mit extend falsch ist, könnte mir jemand erklären?

Antwort

6

In Ihrer else Anweisung suchen Sie key (statt x) in jeder Rekursion: else base key. Fix it mit:

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

BTW, könnte man schreiben:

empty :: State 
empty = \_ -> 0 

seit empty Rückkehr 0 unabhängig vom Eingangssignal.