OCaml 的 Hindley-Milner 类型系统不允许命令式多态性(类似于 System-F),除非通过最近对记录类型的扩展。这同样适用于 F#。
然而,有时需要将用命令式多态性(例如 Coq)编写的程序翻译成此类语言。 Coq 的 OCaml 提取器的解决方案是(谨慎地)使用Obj.magic
,这是一种通用的不安全强制转换。这有效是因为
- 在 OCaml 的运行时系统中,所有值都具有相同的大小,无论其类型如何(32 或 64 位,具体取决于体系结构)
- 应用于原始程序的更复杂的类型系统保证了类型安全。
在 F# 中是否可以做类似的事情?
如果您能详细说明您想要实现的目标,将会很有帮助。一些命令式用法(例如来自 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)