型推論へのきちんとした機能的な参照を探しているなら、私はGundry、McBride、およびMcKinnaの2010の「型推論のコンテキスト」に少し偏っていますが、これは実際の既存の実装への良いガイドではないかもしれません。
あなたが定義した場合:私は、答えの一部は、その値の制限を超えて、本当に多くの困難命令型言語にヒンドリー-ミルナーの型推論を適応させることがないと思いe1; e2ための糖衣構文として(fn _ => e2) e1および定義while e1 do e2のためのシンタックスシュガーとしてはwhiledo e1 (fn () => e2)、どこwhiledo規則的であるが再帰関数
fun whiledo g f = if g then (f (); whiledo g f) else ();
その後、型推論を含むすべてが正常に動作します。
値の制限が特別なテクニックであることについて、私は次の話が好きです。カールクラリーから買ったと思います。次のコードを検討してください。値の制限により、MLでの書き込みが妨げられます。
let
val x: 'a option ref = ref NONE
in
(x := SOME 5; x := SOME "Hello")
end
次のコードと比較してみてください。これはまったく問題ありません。
let
val x: unit -> 'a option ref = fn () => ref NONE
in
(x () := SOME 5; x () := SOME "Hello")
end
2番目の例の機能はわかっています。次の2つの新しいrefセルが作成されます。 NONE、SOME 5し、最初の(an int option ref)に入れ、次にSOME "Hello"2番目の(a string option ref)に入れます。
xx∀ α 。ref(オプション(α ))xΛのα 。ref [ α ] (NONE)
これは、最初の例の「良い」動作の1つが、2番目の例と同じように動作することを示唆します。型レベルのラムダを2回インスタンス化します。最初にでインスタンス化するxとint、x [int]参照セルを保持しているNONEと評価されSOME 5ます。我々はインスタンス化二度目xとstring小文字ます、x [string](に評価するために、さまざまな!)基準セル保持NONE当時とSOME "Hello"。この動作は「正しい」(タイプセーフ)ですが、プログラマーが期待するものとはまったく異なります。このため、プログラマーがこの予期しない種類の動作に対処しないように、MLに値の制限があります。
let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end。では、調査の質問のレベルで、あなたが探している答えは「値の制限を含め、Caml / SMLで開発された手法を適用すること」ですか?