[MLton] HOL's Moscow ML implementation, and pushing MLton to emulate it

Daniel C. Wang danwang@CS.Princeton.EDU
Fri, 08 Apr 2005 19:08:09 -0400


I forgot an extra level of indirection...  here is some example code.
Assume that listF is always a fully boxed rep.
(i.e)' it's always a null pointer or a pointer to a pair of pointers.

Notice that wrapIntList and wrapRealList are constant time operations.
Shao's approach makes polymorphic/intrerpter code pay a penalty. There is no 
polymorphic penalty for monomorphic/host code.

structure List =
   struct
     datatype ('a,'b) listF =
       Nil
     | Cons of ('a * 'b)

     fun length wrap Nil =  0
       | length wrap (Cons(_,b)) = 1 + length wrap (wrap b)

     fun wrapIntList [] = Nil
       | wrapIntList (x::xs) = Cons(x,xs)

     fun wrapRealList [] = Nil
       | wrapRealList (x::xs) = Cons(x,xs)

     val v1 = length wrapIntList (wrapIntList [1,2,3,4])
     val v2 = length wrapRealList (wrapIntList [1.0,2.0,3.0,4.0])
   end

Stephen Weeks wrote:
>>>Sure.  MLton represents a Real64.real list using 12 bytes per list
>>>element, while it represents an Int32.int list using 8 bytes per list
>>>element.
>>
>>In this case the universal rep is just a pair of pointers one to the head 
>>and one to the tail... i.e. you can build that in constant time!
> 
> 
> That is the universal representation of "real * real list", not "real
> list".  It's the recursive type that causes problems.
> 
> _______________________________________________
> MLton mailing list
> MLton@mlton.org
> http://mlton.org/mailman/listinfo/mlton