12

OCaml の Hindley-Milner 型システムは、レコード型のやや最近の拡張を除いて、非予測的ポリモーフィズム (システム F 風) を許可していません。同じことが F# にも当てはまります。

ただし、非予測的ポリモーフィズム (Coq など) で記述されたプログラムをそのような言語に翻訳することが望ましい場合もあります。OCaml に対する Coq のエクストラクタの解決策は、(控えめに) を使用することObj.magicです。これは、ユニバーサル アンセーフ キャストの一種です。これは次の理由で機能します。

  • OCaml のランタイム システムでは、すべての値は型に関係なく同じサイズです (アーキテクチャに応じて 32 ビットまたは 64 ビット)。
  • 元のプログラムに適用されたより洗練された型システムは、型の安全性を保証します。

F# で同様のことを行うことは可能ですか?

4

1 に答える 1

10

達成したいことを正確に詳しく説明していただけると助かります。一部の非予測的な使用 ( Haskell wiki のこの例など) は、単一のジェネリック メソッドで追加の名義型を使用して比較的簡単にエンコードできます。

type IForallList =
    abstract Apply : 'a list -> 'a list

let f = function
| Some(g : IForallList) -> Some(g.Apply [3], g.Apply ("hello" |> Seq.toList))
| None -> None

let rev = { new IForallList with member __.Apply(l) = List.rev l }

let result = f (Some rev)
于 2013-03-28T19:44:40.733 に答える