結論:あまりデータが見えないから。
理由を述べると長いので、端的に。
- 関数内にいるときに、引数が多相だとその引数は出力できない。
- インターフェースファイル内にモジュールの型はほとんど書けない。あくまで型チェックを通せる程度であり、デバッガが実体を見てくれる状態にはならない。
- ファンクタは利用する関数が多相か内部パラメータ依存であることが多い。
1は公式サイト?で「多相だと出ないから、型専用の関数を作ってくれ」とまで書いてある*1。
2はどうしようもない。仕様上そうらしいので。
3が1と2から問題が発生するケースである。
ファンクタで作られたモジュールの要素はデバッガからは何も見えないことになる。
冷静になって考えよう。
ファンクタを使う人は、多くの場合作った人ではない。
その意味で、コードをいじれ、などといわれてできるはずがない。
また、ファンクタを使う理由は、多くの型を間接的に使用する、特定の処理を集めたコードがほしいからだ。
1の解決策なんて愚策以外のなんでもない。
そもそも多相の概念からしてそれを愚策と言わしめるものである。
大きなプログラムの読解にデバッガを使うのは常套手段と聞いていたが、デバッガがここまで使えないんじゃなあ・・・
ちなみに、別の観点ではOCamlDebugはいろいろ面白い。
実行をさかのぼったりできる。
もっとも、入出力が絡むと簡単におかしな挙動に陥るから注意が必要だ。
*1:厳密に言えばtraceに関する箇所だが、OCamlDebugも全く同じ問題なので、そのまま参照している。