-
Notifications
You must be signed in to change notification settings - Fork 8
/
General.sml
51 lines (40 loc) · 1.61 KB
/
General.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
signature GENERAL =
sig
val sum: int list -> int
val Max: int list -> int
val concat: 'a list list -> 'a list
val contains: ''a list -> ''a -> bool
val revAppend: 'a list -> 'a list -> 'a list (* rev a @ b *)
val optVal: 'a -> 'a option -> 'a
val optMap: ('a -> 'b) -> 'a option -> 'b option
val optFold: 'b -> ('a -> 'b) -> 'a option -> 'b
val lookUp: ''a -> (''a * 'b) list -> 'b option
end (* signature GENERAL *)
(*----------*)
structure General: GENERAL =
struct
(* Since functions such as `fold' and `exists' depend on the version,
I program everything from the basic constructors. *)
fun round r = trunc (r + 0.5) (* "truncate" in other versions *)
fun fold g c = let fun f [] = c
| f (h :: t) = g (h, f t)
in f end
val sum = fold (op +) 0
val Max = fold max 0
val concat = fold (op @) []
fun contains list x = let fun f [] = false
| f (h :: t) = (h = x) orelse f t
in f list end
fun revAppend [] yl = yl
| revAppend (x :: xl) yl = revAppend xl (x :: yl)
fun optMap f = fn NONE => NONE
| SOME x => SOME (f x)
fun optFold y f = fn NONE => y
| SOME x => f x
fun optVal y = optFold y (fn x => x)
fun lookUp x =
let fun searchx [] = NONE
| searchx ((x', y) :: rest) = if x = x' then SOME y
else searchx rest
in searchx end
end (* structure General *)