OCaml的Hindley-Milner类型系统不允许使用impredicative polymorphism(àlaSystem-F),除非通过最近的记录类型扩展。这同样适用于F#。
然而,有时需要将用不可预测的多态性(例如Coq)编写的程序翻译成这些语言。 Coq对OCaml的提取器的解决方案是(谨慎地)使用Obj.magic
,这是一种通用的不安全转换。这是因为
是否可以在F#中做类似的事情?
答案 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)