f# - 在 F# 中实现幻像类型

标签 f#

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/

相关文章:

f# - 在 F# 中重写 Erlang

f# - 如何在循环中调用 WriteBytesAsync

f# - F#可以重构为pointfree风格吗?

F# 可变列表为空

.net - 不使用 msbuild 的 F# 编译

f# - 如何在 F# 中优化此移动平均线计算

f# - 在 F# 中使用 Task.WhenAll 重写 C# 代码

f# - 如何将字典条目的值声明为可变的?

f# - System.MissingMethodException : Method not found: 'FSharp. Data.HttpResponse

f# - 如何执行模块做 block ?