-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathch5-conditionals.hs
50 lines (40 loc) · 1.17 KB
/
ch5-conditionals.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module Ch5Conditionals where
data BoolC
= BoolC Bool
| AndC BoolC BoolC
| OrC BoolC BoolC
| GtC ExprC ExprC
| LtC ExprC ExprC
| EqC ExprC ExprC
deriving (Eq, Show)
data ExprC
= NumC Int
| PlusC ExprC ExprC
| MultC ExprC ExprC
| IfC BoolC ExprC ExprC
deriving (Eq, Show)
interp :: ExprC -> Int
interp (NumC n) = n
interp (PlusC l r) = interp l + interp r
interp (MultC l r) = interp l * interp r
interp (IfC cond consequent alternative) =
if (interpB cond)
then (interp consequent)
else (interp alternative)
interpB :: BoolC -> Bool
interpB (BoolC b) = b
interpB (AndC l r) = (interpB l) && (interpB r)
interpB (OrC l r) = (interpB l) || (interpB r)
interpB (GtC l r) = (interp l) > (interp r)
interpB (LtC l r) = (interp l) < (interp r)
interpB (EqC l r) = (interp l) == (interp r)
tests =
[ interp (IfC (BoolC True) (NumC 1) (NumC 2)) == 1
, interp (IfC (BoolC False) (NumC 1) (NumC 2)) == 2
, (==) (interp (IfC (AndC (EqC (PlusC (NumC 2) (NumC 4))
(MultC (NumC 3) (NumC 2)))
(GtC (NumC 5) (NumC 4)))
(NumC 1)
(NumC 2)))
1
]