MLの値の制限により、型の安全性が損なわれる可能性があるコンテキストでの型の一般化が妨げられます。コアの問題は、次の OCaml コードの例のように、シーケンスされた突然変異とポリモーフィック タイプを組み合わせることから発生するようです。
let x = ref [];; (* value restriction prevents generalization here *)
x := 1::!x;; (* type unification with int *)
x := true::!x;; (* error *)
値の制限がなければ、最後の行はエラーなしで型チェックされます。なぜなら、ポリモーフィック型はx
と統合されるからbool
です。これを防ぐには、 の型x
はモノモーフィックのままにする必要があります。
私の質問は次のとおりです。操作のシーケンスを表現するためにモナドを使用することで、値の制限を取り除くことは可能でしょうか?
関数の引数として、モナドのbind
操作を通じて導入された変数は、シーケンス全体で単型のままであるため、一般化の際に特別なケースを導入することなく、値の制限と同じ効果が得られるようです。
これは機能しますか?そうでない場合は、なぜですか?