The following is some SML code that implements the natural numbers using peano arithmetic in the SML type system. These numbers can be used to protect access to list functions. I haven't yet figured out if addition is possible, but I'm hoping that it is. It could be really handy!
signature SLIST = sig type 'a nat type Z type 'a S val S : 'a nat -> 'a S nat val P : 'a S nat -> 'a nat val Z : unit -> Z nat val zerop : 'a nat -> bool val toInt : 'a nat -> int type ('elt,'n) slist val snil : unit -> ('elt, Z nat) slist val scons : 'elt -> ('elt, 'n nat) slist -> ('elt, 'n S nat) slist val :+: : 'elt * ('elt, 'n nat) slist -> ('elt, 'n S nat) slist val shd : ('elt, 'n S nat) slist -> 'elt val stl : ('elt, 'n S nat) slist -> ('elt, 'n nat) slist val slen : ('elt, 'n S nat) slist -> int end structure SList :> SLIST = struct (* encode integer types *) type 'a nat = int type Z = unit type 'a S = unit fun S i = i+1; fun P i = i-1; fun Z () = 0 fun zerop 0 = true | zerop _ = false fun toInt d = d type ('elt, 'n) slist = 'elt list * 'n fun snil () = ([],0) fun scons elt sl = let val (l,i) = sl in ((elt::l),S i) end infixr :+: fun x :+: y = scons x y fun shd sl = let val (h::t,i) = sl in h end fun stl sl = let val (h::t,i) = sl in (t,P i) end fun slen sl = let val (_,i) = sl in i end end open SList infixr :+: val mylist = 1 :+: 2 :+: 3 :+: snil(); val the_head = shd mylist; val the_tail = stl mylist; val the_next_head = shd the_tail; (* This doesn't even compile! val head_of_nil = shd (snil()) *)
Comments
Post a Comment