.net - 在 F# 中定义静态类

标签 .net static f#

是否可以在 F# 中定义包含可重载成员的静态类? let模块绑定(bind)不能被重载,即使它们被编译成静态类中的静态成员。
type declerations 可以包含静态成员,但我不知道类型本身是否可以设为静态。

我目前的解决方案是定义一个 type使用私有(private)构造函数并使用它。我想知道是否有一种方法可以根据需要定义静态类型。

最佳答案

在 F# 中没有定义静态类型的工具。

第一种选择是定义一个模块,但它缺乏重载函数的能力(这是你所追求的)。第二种选择是用静态成员声明一个普通类型。

关于第二种方法,正是the accepted answer对您描述的旧问题。我重构了代码以更容易地解释它。首先,定义了一个虚拟的单案例可区分联合:

type Overloads = Overloads

其次,您利用了静态成员可以重载的事实:
type Overloads with
    static member ($) (Overloads, m1: #IMeasurable) = fun (m2: #IMeasurable) -> m1.Measure + m2.Measure 
    static member ($) (Overloads, m1: int) = fun (m2: #IMeasurable) -> m1 + m2.Measure

第三,使用 inline 将这些重载方法的约束传播到 let-bounds。关键词:
let inline ( |+| ) m1 m2 = (Overloads $ m1) m2

当您能够使用此方法重载 let-bounds 时,您应该创建一个包装模块来保存这些函数并标记您的类型 private .

关于.net - 在 F# 中定义静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101995/

相关文章:

c# - 有什么方法可以自动化 Windows 窗体测试吗?

xml - 期望 int 返回值

asynchronous - MailboxProcessor.Dispose 不会使对象 GC 可收集

f# - 为什么不能使用不同类型的参数两次使用相同的函数?

c# - 如果我在毫秒内调用太多,为什么 Socket over Tcp 不发送?

c# - 确定类型是否为枚举类型的通用列表

c# - 将 IEnumerable<T> 转换为 IEnumerator<T> 有什么作用

java - 静态嵌套类如何是静态的?如果是的话,为什么我们必须使用 new 来初始化它?

java - 从另一个类调用静态数组

C++ 静态类成员初始化