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:
Per exemple, Add (Val 3) (Div (Val 4) (Val 2)) representa 3 + 4 / 2, 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"