1 module Value(Value(..), Op1(..), Op2(..), uno, duo) where 2 3 data Value 4 = Num Integer 5 | Bol Bool 6 | Wrong 7 deriving (Eq, Show) 8 9 data Op1 10 = Not 11 | Minus 12 deriving (Eq, Show) 13 14 data Op2 15 = And | Or 16 | Mul | Add | Sub | Div | Mod 17 | Less | LessEq | Eq 18 deriving (Eq, Show, Enum, Bounded) 19 20 uno :: Op1 -> (Value -> Value) 21 uno Not (Bol b) = Bol (not b) 22 uno Minus (Num n) = Num (negate n) 23 uno _ _ = Wrong 24 25 duo :: Op2 -> (Value -> Value -> Value) 26 duo And (Bol a) (Bol b) = Bol (a && b) 27 duo Or (Bol a) (Bol b) = Bol (a || b) 28 duo Eq (Bol a) (Bol b) = Bol (a == b) 29 duo Mul (Num m) (Num n) = Num (m * n) 30 duo Add (Num m) (Num n) = Num (m + n) 31 duo Sub (Num m) (Num n) = Num (m - n) 32 duo Div (Num m) (Num n) | n /= 0 = Num (m `div` n) 33 duo Mod (Num m) (Num n) | n /= 0 = Num (m `mod` n) 34 duo Less (Num m) (Num n) = Bol (m < n) 35 duo LessEq (Num m) (Num n) = Bol (m <= n) 36 duo Eq (Num m) (Num n) = Bol (m == n) 37 duo _ _ _ = Wrong