-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhaskell.sml
127 lines (122 loc) · 4.94 KB
/
haskell.sml
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
structure Haskell =
struct
type Var = string
datatype Exp =
Literal of Literal
| Var of Var
| IfThenElse of Exp * Exp
| Let of Var * Exp * Exp
| Call of Var * Exp list
| Fn of Var * Exp
| Fun of Var * Var * Exp
| Op of Op
and Literal =
Int of int
| Real of real
| Char of char
| Bool of bool
and Op =
Not of Exp
| And of Exp * Exp
| Or of Exp * Exp
| Lt of Exp * Exp
| Leq of Exp * Exp
| Gt of Exp * Exp
| Geq of Exp * Exp
| Eq of Exp * Exp
| Add of Exp * Exp
| Sub of Exp * Exp
| Mul of Exp * Exp
| Div of Exp * Exp
| Pow of Exp * Exp
(* | Fun of Var * Var list * Exp * Exp *)
(* | Case of Exp *)
fun lookup (key, (entry_key, entry_value) :: entries) =
if String.compare (key, entry_key) = EQUAL then SOME entry_value
else lookup (key, entries)
| lookup (_, []) = NONE
val x = 2; (* | Tuple of Literal list | String | List | Maybe | Lambda *)
fun eval (Op op+, env) =
(case op+ of
Not m =>
(case eval (m, env) of
SOME (Bool m) => SOME (Bool (not m))
| _ => NONE)
| And (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Bool m), SOME (Bool n)) => SOME (Bool (m andalso n))
| _ => NONE)
| Or (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Bool m), SOME (Bool n)) => SOME (Bool (m orelse n))
| _ => NONE)
| Lt (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Bool (m < n))
| (SOME (Real m), SOME (Real n)) => SOME (Bool (m < n))
| _ => NONE)
| Leq (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Bool (m <= n))
| (SOME (Real m), SOME (Real n)) => SOME (Bool (m <= n))
| _ => NONE)
| Gt (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Bool (m > n))
| (SOME (Real m), SOME (Real n)) => SOME (Bool (m > n))
| _ => NONE)
| Geq (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Bool (m >= n))
| (SOME (Real m), SOME (Real n)) => SOME (Bool (m >= n))
| _ => NONE)
| Eq (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) =>
SOME (Bool (Int.compare (m, n) = EQUAL))
| (SOME (Real m), SOME (Real n)) =>
SOME (Bool (Real.compare (m, n) = EQUAL))
| (SOME (Char m), SOME (Char n)) =>
SOME (Bool (Char.compare (m, n) = EQUAL))
| (SOME (Bool m), SOME (Bool n)) => SOME (Bool (m = n))
| _ => NONE)
| Add (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Int (Int.+ (m, n)))
| (SOME (Int m), SOME (Real n)) =>
SOME (Real (Real.+ (Real.fromInt m, n)))
| (SOME (Real m), SOME (Int n)) =>
SOME (Real (Real.+ (m, Real.fromInt n)))
| (SOME (Real m), SOME (Real n)) => SOME (Real (Real.+ (m, n)))
| _ => NONE)
| Sub (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Int (Int.- (m, n)))
| (SOME (Int m), SOME (Real n)) =>
SOME (Real (Real.- (Real.fromInt m, n)))
| (SOME (Real m), SOME (Int n)) =>
SOME (Real (Real.- (m, Real.fromInt n)))
| (SOME (Real m), SOME (Real n)) => SOME (Real (Real.- (m, n)))
| _ => NONE)
| Mul (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Int (Int.* (m, n)))
| (SOME (Int m), SOME (Real n)) =>
SOME (Real (Real.* (Real.fromInt m, n)))
| (SOME (Real m), SOME (Int n)) =>
SOME (Real (Real.* (m, Real.fromInt n)))
| (SOME (Real m), SOME (Real n)) => SOME (Real (Real.* (m, n)))
| _ => NONE)
| Div (m, n) =>
(case (eval (m, env), eval (n, env)) of
(SOME (Int m), SOME (Int n)) => SOME (Int (Int.div (m, n)))
| (SOME (Int m), SOME (Real n)) =>
SOME (Real (Real./ (Real.fromInt m, n)))
| (SOME (Real m), SOME (Int n)) =>
SOME (Real (Real./ (m, Real.fromInt n)))
| (SOME (Real m), SOME (Real n)) => SOME (Real (Real./ (m, n)))
| _ => NONE)
| Pow (_, _) => NONE)
| eval (Literal l, _) = SOME l
| eval (_, _) = NONE
end (* val x = 0; (* (case o ) *) (* fun eval(Not(a)) = if eval *) (* fun eval(a) = *) (* case Not(a) *) *)