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
|
structure CList =
struct
datatype 'a clist' = Cons of 'a * 'a clist ref
withtype 'a clist = 'a clist' option
fun cnil () = NONE
fun ccons (h, t) = SOME (Cons (h, ref t))
fun match cl nilCase consCase =
case cl of
NONE => nilCase ()
| SOME (Cons (h, t)) => consCase (h, !t)
fun fromList l =
case l of
[] => cnil ()
| h::t => ccons (h, fromList t)
fun repeat x =
let
val r = ref NONE
val cl = SOME (Cons (x, r))
val () = r := cl
in
cl
end
local
val max = 1000
fun length' (cl, n) =
if n >= max
then NONE
else match cl
(fn () => SOME n)
(fn (_,t) => length' (t, n + 1))
in
fun length cl = length' (cl, 0)
end
end
val cl = CList.repeat #"x"
val n = CList.length cl
val () =
case n of
NONE => print "NONE\n"
| SOME n => print (concat ["SOME ", Int.toString n, "\n"])
val cl = CList.fromList [1,2,3,4,5,6,7,8,9]
val n = CList.length cl
val () =
case n of
NONE => print "NONE\n"
| SOME n => print (concat ["SOME ", Int.toString n, "\n"])
|