Code Snippet:
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
| type ('a) Set =
private
{ empty: 'a t
add: 'a -> 'a t -> 'a t
exists: 'a -> 'a t -> bool }
member x.Empty = x.empty
member x.Add y ys = x.add y ys
member x.Exists y ys = x.exists y ys
static member Functor (orderType) : 'a Set =
{ empty = { t = Nil }
add = fun x xs ->
let rec add y = function
| Nil -> Cons(y,Nil)
| Cons(hd,tl) ->
match orderType.compare y hd with
| Less -> Cons(x,xs.t)
| Equal -> xs.t
| Greater -> Cons(hd,add y tl)
{ t = add x xs.t }
exists = fun x xs ->
let rec exists y = function
| Nil -> false
| Cons(hd,tl) ->
match orderType.compare y hd with
| Less -> false
| Equal -> true
| Greater -> exists y tl
exists x xs.t }
and ('a) t = private { t : 'a s }
and ('a) s = private Cons of 'a * 'a s | Nil
and ('a) OrderType = { compare: 'a -> 'a -> Comparison }
and Comparison = Less | Equal | Greater
|
Code output:
Code Snippet:
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
| let floatSet =
Set.Functor
{ compare = fun (x:float) (y:float) ->
if x = y then
Equal
else if x < y then
Less
else
Greater }
floatSet.Empty
|> floatSet.Add 43.
|> floatSet.Add 42.
|> floatSet.Exists 42.
let stringSet =
Set.Functor
{ compare = fun (x:string) (y:string) ->
if x = y then
Equal
else if x < y then
Less
else
Greater }
stringSet.Empty
|> stringSet.Add "43"
|> stringSet.Add "42"
|> stringSet.Exists "42"
|
Code output:
References:
- Part I - An introduction to OCaml: