型推論へのきちんとした機能的な参照を探しているなら、私は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
)に入れます。
x
x
∀ α 。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で開発された手法を適用すること」ですか?