OCamlのHindley-Milner型システムでは、レコード型の多少の拡張を除いては、impredicative polymorphism(System-F)は使用できません。 F#も同様です。F#の記述型多型
しかし、忠実な多型(例えば、Coq)を用いて記述されたプログラムをそのような言語に翻訳することが時には望ましい。 OCamlへのCoqの抽出プログラムの解決策は、普遍的な安全でないキャストの一種であるObj.magic
を(控えめに)使用することです。 OCamlでのランタイムシステムにおける
- は、すべての値が
- 元のプログラムに適用され、より洗練されたタイプのシステム は、安全性を入力する保証(32ビットまたは64ビットのアーキテクチャに応じて)にかかわらず、その種類の同じ大きさを持っているので、これは動作します。
F#で同様のことをすることはできますか?
それらが導入されたとして、ポリモーフィックレコードのフィールドは、ほとんどの基準では「最近」ではありません2002年には3.05であった。 – gasche
"impredicative polymorphism"の意味はCoqの文脈では異なっていることに言及する価値があります。 Coqは、型変数を多態型でインスタンス化することを許可しますが、通常、値がボックス化されている場合でも、それをいつ実行できるかに制限があります。これは、論理的な一貫性を保証するために行われます。 OCamlとHaskell側では、 "impredicative"と呼ばれているのは、タイプ変数に* unboxed *(つまりレコードではない)多型を代入できることだけです。したがって、上位ランクの型をより便利にする方法です。 –