Es vol tenir un mòdul per a manipular i avaluar expressions d’enters amb operacions de suma, resta, multiplicació i divisió. Per això, es defineix el tipus següent:
data Expr = Val Int | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr
Per exemple, Add (Val 3) (Div (Val 4) (Val 2))
representa
,
que s’avalua a 5.
Utilitzant el tipus Expr, definiu una operació
eval1 :: Expr -> Int que, donada una expressió, en
retorni la seva avaluació. Podeu suposar que mai hi haurà divisions per
zero.
Utilitzant el tipus Expr, definiu una operació
eval2 :: Expr -> Maybe Int que, donada una expressió, en
retorni la seva avaluació com un valor Just. En el cas que
es produeixi una divisió per zero, el resultat ha de ser
Nothing. Segurament voleu usar la notació do
sobre la mònada Maybe a.
Utilitzant el tipus Expr, definiu una operació
eval3 :: Expr -> Either String Int que, donada una
expressió, en retorni la seva avaluació com un valor Right.
En el cas que es produeixi una divisió per zero, el resultat ha de ser
Left "div0" per indicar l’error en qüestió. Segurament
voleu usar la notació do sobre la mònada
Either a b.
Input
eval1 (Val 2) eval1 (Add (Val 2) (Val 3)) eval1 (Sub (Val 2) (Val 3)) eval1 (Div (Val 4) (Val 2)) eval1 (Mul (Add (Val 2) (Val 3)) (Sub (Val 2) (Val 3)))
Output
2 5 -1 2 -5
Input
eval2 (Val 2) eval2 (Add (Val 2) (Val 3)) eval2 (Sub (Val 2) (Val 3)) eval2 (Div (Val 4) (Val 2)) eval2 (Mul (Add (Val 2) (Val 3)) (Sub (Val 2) (Val 3))) eval2 (Div (Val 4) (Val 0)) eval2 (Add (Div (Val 4) (Val 0)) (Val 3)) eval2 (Add (Val 3) (Div (Val 4) (Val 0)))
Output
Just 2 Just 5 Just (-1) Just 2 Just (-5) Nothing Nothing Nothing
Input
eval3 (Val 2) eval3 (Add (Val 2) (Val 3)) eval3 (Sub (Val 2) (Val 3)) eval3 (Div (Val 4) (Val 2)) eval3 (Mul (Add (Val 2) (Val 3)) (Sub (Val 2) (Val 3))) eval3 (Div (Val 4) (Val 0)) eval3 (Add (Div (Val 4) (Val 0)) (Val 3)) eval3 (Add (Val 3) (Div (Val 4) (Val 0)))
Output
Right 2 Right 5 Right (-1) Right 2 Right (-5) Left "div0" Left "div0" Left "div0"