4

基本的に、次のような多相関数を返す関数が必要です。

楽しい foo () = fn x => x

したがって、foo 関数は unit 型の値を受け取り、ポリモーフィック恒等関数を返します。コンパイラはこれに満足しています。次のようになります。

val foo = fn : unit -> 'a -> 'a

しかし、実際に foo 関数を呼び出すと、戻り値は期待したものではありません

val it = fn : ?.X1 -> ?.X2

それが言う値の制限のために一般化することはできません、何か助けはありますか? 前もって感謝します

4

1 に答える 1

5

技術的な理由から、関数呼び出しの結果を一般化(つまり、多相化)することはできません。呼び出しの結果は単相型でなければなりません。そうでない場合は、次の汚いトリックで型システムを覆すことができます。

  1. ref []タイプのリストを呼び出して取得するforall 'a . 'a list ref
  2. 文字列を挿入します。
  3. 関数を削除する

これで、任意の文字列の内容をコードとして実行できるようになりました。良くない。

によって返される値がモノモーフィックであることを主張することによりref []、文字列のリストまたは関数のリストとして使用できるが、両方として使用できないことを保証します。したがって、これは型の安全性のために支払う代償の一部です。

于 2010-01-28T23:11:57.840 に答える