OCaml 的 Hindley-Milner 类型系统不允许隐含多态性(à la System-F),除非通过最近对记录类型的扩展。这同样适用于 F#。
然而,有时需要将用暗示性多态性(例如 Coq)编写的程序翻译成这样的语言。Coq 对 OCaml 的提取器的解决方案是(少量)使用Obj.magic
,这是一种通用的不安全类型转换。这有效,因为
- 在 OCaml 的运行时系统中,无论其类型如何,所有值都具有相同的大小(32 位或 64 位,具体取决于架构)
- 应用于原始程序的更复杂的类型系统保证了类型安全。
是否可以在 F# 中做类似的事情?