MLに限定した話じゃないよな
静的型付き言語をGC付きで実装するときには避けて通れない点だ
データが整数かポインタかどうやって判定する?

α.データだけを見て判定する
たとえば有効なアドレスの可能性があるならポインタと判定し
その可能性がゼロのときに限って整数とみる
ゴミを除ききれないのが欠点だ

β.実行時にも型情報をもたせてGC時にそれを見て判定する

β.1.データに型情報を埋め込む
32bitワードを31bit整数と1bit型情報で分けるのがこの方法
データの数に比例して型情報の合計サイズも増えてしまうのが欠点だな

β.2.型情報をデータと別の領域に持つ
データの数が増えても型情報のサイズは一定
しかし多相型を扱えない. データの型が実行時にならないと
決まらないから型情報をコンパイル時につくれないから.

例えばSun Javaの実装は別領域に配置した型情報への
ポインタをオブジェクトに持たせているからβ.1.とβ.2.
の折衷だな
MLのデータ構造に比べたらJavaのオブジェクトはそれほど頻繁
に生成されるものではないからポインタを持たせるコスト
もacceptableだと判断したんだな
MLの場合膨大な数のデータが生成と消滅を繰り返すから
ワードサイズのポインタを持たせるのは到底受け入れられ
ない. bitだけ持たせることにしたんだな. それしかいらないし.
Javaの場合, 整数かポインタかだけじゃなくてクラスやインタフェイス
の継承関係も実行時に必要だから1bitじゃ足りない