12

OCaml 的 Hindley-Milner 类型系统不允许隐含多态性(à la System-F),除非通过最近对记录类型的扩展。这同样适用于 F#。

然而,有时需要将用暗示性多态性(例如 Coq)编写的程序翻译成这样的语言。Coq 对 OCaml 的提取器的解决方案是(少量)使用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 回答