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