あーそうか。GCなどのランタイムを記述しているコードにおける型が、
実行するプログラムの方に漏れ出す必要は無いのか。

例えばメモリをモナドにしといて、

type Size = Int
type Address = Int

-- サイズを取って、アドレス(メモリページ内インデックス)を返す
allocate :: Size -> Memory Address

とか書いとく。これはこれでランタイムライブラリとしてコンパイルされる。

一方、アプリケーションの方では、

data Point a = Point a a

があったとすると、Point 2 3 が呼ばれるところのコードは
C風に書けば

  Word *ptr = allocate(sizeof(Point));
  ptr[1] = (Word)2;
  ptr[2] = (Word)3;
  return ptr

みたいにコンパイルされると。ここで、allocateがモナドを使ってる
かどうかというのはアプリケーションには関係ないわけですね。

Lispだと、ランタイムのallocateをアプリケーションレベルで
直接呼ぶという危ないことができます。allocateは実行時型情報だけ
セットして他が初期化されていないオブジェクトを返し、残りを
アプリケーションが自分で埋めることになります。

--shiro



--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/