是否可以在 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/