F#中的impredicative多态性

时间:2013-03-28 19:01:19

标签: f# polymorphism ocaml coq impredicativetypes

OCaml的Hindley-Milner类型系统不允许使用impredicative polymorphism(àlaSystem-F),除非通过最近的记录类型扩展。这同样适用于F#。

然而,有时需要将用不可预测的多态性(例如Coq)编写的程序翻译成这些语言。 Coq对OCaml的提取器的解决方案是(谨慎地)使用Obj.magic,这是一种通用的不安全转换。这是因为

  • 在OCaml的运行时系统中,所有值都具有相同的大小,无论其类型如何(32位或64位,具体取决于架构)
  • 应用于原始程序的更复杂的类型系统可确保类型安全。

是否可以在F#中做类似的事情?

1 个答案:

答案 0 :(得分:10)

如果你能详细说明你想要达到的目标,那将会很有帮助。一些不可预测的用法(例如来自Haskell wiki的this example)使用一个通用方法使用额外的名义类型进行编码相对容易:

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)