2013-05-20 22 views
7

Na dzisiejszym egzaminie poproszono mnie o utworzenie drzewa oceny ekspresji w Haskell. Zwykle odpowiedź jest tak prosta, jak:Drzewo oceny ekspresji w Haskell

data Expr = Value Integer 
      | Add Expr Expr 
      | Sub Expr Expr 
      | Mul Expr Expr 

I aby go ocenić, wystarczy użyć funkcji takich jak:

eval :: Expr -> Integer 
eval (Value x) = x 
eval (Add l r) = eval l + eval r 
eval (Sub l r) = eval l - eval r 
eval (Mul l r) = eval l * eval r 

Jednak dzisiaj dostaliśmy Typ danych:

data Op = Add 
     | Sub 
     | Mul 

Więc założyłem, że tworzę drzewo wyrażeń, które mogłem zrobić:

data Expr = Value Integer 
      | Op Expr Expr 

Używaj tej samej funkcji eval. Jednak od tej pory napisałem tę funkcję i wczytałem ją do GHCI, ale wydaje się, że nie działa. Czy ktoś może wyjaśnić, dlaczego to nie działa?

Odpowiedz

13

Należy zdefiniować konstruktor danych (pod warunkiem nazwę)

data Expr = Value Integer | Compute Op Expr Expr 
          ^^^^^^^ 

następnie

eval :: Expr -> Integer 
eval (Value x) = x 
eval (Compute Add l r) = eval l + eval r 

i tak dalej.

:)

+0

Ahhhhhh ok, dziękuję bardzo. Obecnie jest to oczywiste, ale posiadanie wielu konstruktorów już mnie trochę zdezorientowało. –

+4

Twój nauczyciel jest dobry, zmuszając cię do myślenia (nie tylko pamiętaj): D – josejuan