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

**Daniel C. Wang
**
danwang@CS.Princeton.EDU

*Thu, 07 Apr 2005 15:37:47 -0400*

Here's one example of how to deal with polymorphic recursive structures in a
uniform way without recursively coercing the whole structure into a
univerisal rep.
(*--------------------------------------------------------------------------*)
structure U :> sig
datatype ('a,'b) T =
I of int
| S of string
| P of ('a * 'b)
val mapF : ('a -> 'c) -> ('b -> 'd) -> ('a,'b) T -> ('c,'d) T
end =
struct
datatype ('a,'b) T =
I of int
| S of string
| P of ('a * 'b)
fun mapF f g (I i) = (I i)
| mapF f g (S s) = (S s)
| mapF f g (P(x,y)) = P(f x,g y)
end
structure ToString =
struct
fun toStringU f g l =
case (U.mapF f g l) of
(U.I i) => (Int.toString i)
| (U.S s) => "\""^s^"\""
| (U.P(x,y)) =>
"<"^(toStringU f g x)^(", ")^(toStringU f g y)^">"
fun copyU f g l =
case (U.mapF f g l) of
(U.I i) => (U.I i)
| (U.S s) => (U.S s)
| (U.P(x,y)) => U.P(copyU f g x,copyU f g y)
fun injInt i = (U.I i)
fun injList [] = (U.I 0)
| injList (x::xs) = U.P(x,xs)
fun toStringList t l = toStringU t injList (injList l)
fun toStringIntList l = toStringList injInt l
end