2013-05-20 14 views
7

In un esame oggi mi è stato chiesto di creare un albero di valutazione delle espressioni in Haskell. Di solito la risposta è semplice come:Albero di valutazione delle espressioni in Haskell

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

E per valutarlo, è sufficiente utilizzare una funzione come ad esempio:

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 

Tuttavia oggi, ci hanno dato un tipo di dati:

data Op = Add 
     | Sub 
     | Mul 

Quindi ho pensato di creare l'albero delle espressioni che potevo fare:

data Expr = Value Integer 
      | Op Expr Expr 

E utilizzare la stessa funzione eval. Tuttavia, da allora ho scritto quella funzione e l'ho caricata in GHCI, ma non sembra funzionare. Qualcuno potrebbe spiegare perché questo non funziona?

risposta

13

è necessario definire un costruttore di dati (fornendo un nome)

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

poi

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

e così via.

:)

+0

Ahhhhhh ok, grazie mille. Evidentemente ovvio, ma avere più costruttori mi ha già un po 'confuso. –

+4

Il tuo insegnante ti costringe a pensare (non solo ricordare): D – josejuan

Problemi correlati