ValRef: module { PATH: con "valref.dis"; IntVal: adt { val: int; less: fn(n: ref IntVal, m: ref IntVal): int; }; StringVal: adt { val: string; less: fn(n: ref StringVal, m: ref StringVal): int; }; Val: adt[ValT] for { ValT => less: fn(n: ValT, m: ValT): int; } { val: ValT; less: fn(n: ref Val, m: ref Val): int; }; # convenience constructors IVal: fn(val: int): ref Val[ref IntVal]; SVal: fn(val: string): ref Val[ref StringVal]; };