Type system

授業の課題で Jaう゛ぁを使わなくてよくなったのはいいんだけど、OCamlOCaml でよくわからん。具体的に何かというと、またもや interpreter を書いてるんですが、rudimentary な call-by-need を実装せよと指定されているので、interpret されてる (OCaml じゃない) 方の世界からは見えない promise を実装してるんですな、これが (一般には suspension というらしいが)。で、

type value = (* 整数とか閉包とか、interpret される言語での型諸々 *)
and promise_impl = { expr:exp; uenv:environment; }
and maybe_value = Value of value | Promise of promise
and promise = { mutable cell:maybe_value; }
and binding = { sym:symbol; valu:promise; }

としてるけど、何か釈然としない。何で

promise = { mutable value:(Value value | Promise promise_impl); }

とか、もっと言えば

maybe_value = (Value of value | Promise of promise) ref

とかできないのか? 実装側からすれば特に都合悪そうな感じはしないんだけど。Anonymous でええやん。名前考えんのめんどいって。まさか構造体の使いどころ間違ってるとか?
追記: む、これは self-destructive な関数を promise_impl にすれば済むんだった。C で sigscheme 書いてたときの癖がついてしまっとる。
そしてもう一つ。promise_impl が閉じ込めてる環境の名前が *u*env になってるけど、これは閉包をあらわす構造体のもつ環境が既に env という名前を取ってるからなんですな。Pattern matching で名前の競合がまずいのはわかるけど、型注釈で回避とかでいいじゃないですか。何で全面禁止?