1 module Value(Value(..), Op1(..), Op2(..), uno, duo) where 2 3 data Value 4 = Num Integer 5 | Log 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 16 | Or 17 | Mul 18 | Add 19 | Sub 20 | Div 21 | Mod 22 | Less 23 | LessEq 24 | Eq 25 deriving (Eq, Enum, Bounded, Show) 26 27 uno :: Op1 -> Value -> Value 28 uno Not (Log b) = Log (not b) 29 uno Minus (Num n) = Num (negate n) 30 uno _ _ = Wrong 31 32 duo :: Op2 -> Value -> Value -> Value 33 duo And (Log a) (Log b) = Log (a && b) 34 duo Or (Log a) (Log b) = Log (a || b) 35 duo Eq (Log a) (Log b) = Log (a == b) 36 duo Mul (Num m) (Num n) = Num (m * n) 37 duo Add (Num m) (Num n) = Num (m + n) 38 duo Sub (Num m) (Num n) = Num (m - n) 39 duo Div (Num m) (Num n) | n /= 0 = Num (m `div` n) 40 duo Mod (Num m) (Num n) | n /= 0 = Num (m `mod` n) 41 duo Less (Num m) (Num n) = Log (m < n) 42 duo LessEq (Num m) (Num n) = Log (m <= n) 43 duo Eq (Num m) (Num n) = Log (m == n) 44 duo _ _ _ = Wrong