MLton does not hide the equality aspect of types declared in
abstype declarations. So, MLton accepts programs like the
following, while the Definition rejects them.
abstype t = T with end
val _ = fn (t1, t2 : t) => t1 = t2
abstype t = T with val a = T end
val _ = a = a
One consequence of this choice is that MLton accepts the following
program, in accordance with the Definition.
abstype t = T with val eq = op = end
val _ = fn (t1, t2 : t) => eq (t1, t2)
Other implementations will typically reject this program, because they
make an early choice for the type of eq to be ''a * ''a ->
bool instead of t * t -> bool. The choice is understandable,
since the Definition accepts the following program.
abstype t = T with val eq = op = end
val _ = eq (1, 2)