Ocaml 程序员可以使用所谓的“幻像类型”来使用类型系统强制执行一些约束。一个很好的例子可以在 http://ocaml.janestreet.com/?q=node/11 找到。 .
语法 type readonly
在 F# 中不起作用。它可以替换为定义为 type readonly = ReadOnlyDummyValue
的伪幻像类型。为了实现上述博客文章中的技巧。
有没有更好的方法在 F# 中定义幻像类型?
最佳答案
我认为只使用 type somename
定义类型在 F# 中不起作用。 F# 编译器需要从声明中生成一些 .NET 类型,并且 F# 规范没有明确定义幻像类型应该发生什么。
您可以在实现文件 (.fs) 中创建一个具体类型(例如,使用 type somename = ReadOnlyDummyValue
)并通过添加 type somename
来隐藏该类型的内部。到接口(interface)文件 (.fsi)。通过这种方式,您可以非常接近幻像类型 - 文件外部的用户将看不到该类型的内部。
另一个吸引人的选择是使用接口(interface)。这对我来说听起来很合乎逻辑,因为空接口(interface)可能是您可以声明的最简单的类型(并且它不引入任何虚拟标识符)。空界面如下所示:
type CanRead = interface end
type CanWrite = interface end
在这种情况下,有趣的是,您还可以创建继承的接口(interface):
type CanReadWrite =
inherit CanRead
inherit CanWrite
然后你可以写一个函数来接受
Ref<CanRead, int>
类型的值。还有 Ref<CanReadWrite, int>
类型的值(因为这些值也支持阅读):let foo (arg:Ref<#CanRead, int>) = // ...
这似乎是有用的东西。我实际上很感兴趣这是否也可以在 OCaml 中完成(因为它依赖于 F# 对接口(interface)和继承的支持)。
关于f# - 在 F# 中实现幻像类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3583679/