9 * : 'a
* 'a
-> 'a
} -> {ring
: ring
,
12 val zero
: ring
-> elt
14 val ringOf
: elt
-> ring
16 exception TypeError (* raised by
* or
+ with bogus args
*)
17 val * : elt
* elt
-> elt
18 val + : elt
* elt
-> elt
21 structure Ring
: RING
=
24 Ring
of unit
-> {zero
: elt
,
28 and elt
= Elt
of unit
-> {ring
: ring
}
30 fun ringOf(Elt th
) = #
ring(th())
32 fun extract
sel (Ring th
) = sel(th())
34 val zero
= extract #zero
35 val one
= extract #one
38 fun make
sel (x
,y
) = extract
sel (ringOf x
) (x
,y
)
46 fun 'a make
{zero
, one
, +, * = op *} =
48 val r
: 'a option ref
= ref NONE
53 NONE
=> raise TypeError
54 | SOME x
=> (x
before r
:= NONE
))
56 fun ring() = {zero
= elt zero
,
61 Elt(fn () => (r
:= SOME x
;
63 and binary (f
: 'a
* 'a
-> 'a
) (x
: elt
, y
: elt
) =
64 elt(f(valOf x
, valOf y
))
72 val {ring
= ints
, valOf
} = Ring
.make
{zero
= 0,
77 val _
= (print(Int.toString(valOf(Ring
.+(Ring
.one ints
,