1 datatype 'a t
= R
of 'a | L
of 'a t t
3 val rec build
: int -> int t
=
5 | n
=> L (R (build (n
- 1)))
7 val rec depth
: int t
-> int =
9 |
L (R z
) => 1 + depth z
12 val n
= depth (build
13)
22 val rec build
: int -> int t
=
24 | n
=> L (R (build (n
- 1)))
35 val v2
: int t t
= R v0
36 val v1
: int t
= L (v2
: int t t
)
37 val _
= L (L (R (R (R
13))))
38 val _
= L (R (L (R (R
13))))
39 val _
= L (L (R (R (R (R (R
13))))))
44 datatype 'a t
= A
of 'a | B
of ('a t
* 'a t
) t
59 fun d ((A _
) : 'a t
) : int = 0
60 |
d ((B (A (x
, _
))) : 'a t
) : int = 1 + d x
68 Here
's (the relevant part
of) what the monomorphiser
in smlc returns
71 datatype t_0
= B_0
of t_1 | A_0
of int
72 and t_1
= A_1
of (t_0
* t_0
)
74 It figures out exactly your observation that every use
of B must be
78 datatype z0
= A
of int | B
of z1
81 datatype z1
= A
of z0
* z0 | B
of z2
84 datatype z2
= A
of z1
* z1 | B
of z3
94 B (B (A (A (z0
,z0
), A (z0
,z0
))))
96 B (B (A (A (v1
, v1
), A (v1
, v1
))))
98 B (B (A (A (v1
, v1
), A (v1
, v1
))))
102 datatype z
= A
of int | B
of (z
* z
) t
103 datatype w
= A
of z
* z | B
of (w
* w
) t