Ser*_*kov 5 extension-methods f#
另一个与F#功能相关的问题称为"类型扩展".
在F#中扩展枚举似乎是不可能的.我使用C#Extensions方法来扩展枚举:添加范围验证逻辑,返回字符串表示的方法等.
不幸的是,似乎可能只扩展有区别的联合,但不可能扩展简单的枚举:
1.内在延伸
// CustomEnum.fs
module CustomEnumModule
type CustomEnum =
| Value1 = 1
| Value2 = 2
// Trying to split definition of the enum
type CustomEnum with
| Value3 = 3
Run Code Online (Sandbox Code Playgroud)
错误:"错误FS0010:意外符号'|' 在成员定义中"
2.可选扩展
// CustomEnumEx.fs
open CustomEnumModule
type CustomEnum with
member public x.PrintValue() =
printfn "%A" x
Run Code Online (Sandbox Code Playgroud)
错误:"错误FS0896:枚举不能包含成员"
对我来说这似乎很奇怪,因为(1)我们可以将简单的枚举视为全功能区分联合的一个特例,我们可以扩展有区别的联合和(2)扩展.NET枚举是添加一些功能的好方法(包括FP-功能)到现有的基础设施.
这种行为是故意的还是实施中的简单错误?
PS不幸的是F#Spec在这方面是沉默的,或者至少我找不到任何一种或那种行为的证据.
可以创建一个名称与类型相同的模块,类似于扩展类型:
type CustomEnum = Value1 = 1 | Value2 = 2
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module CustomEnum =
let Print = function
| CustomEnum.Value1 -> "One"
| CustomEnum.Value2 -> "Two"
| _ -> invalidArg "" ""
let value = CustomEnum.Value1
let s = CustomEnum.Print value
Run Code Online (Sandbox Code Playgroud)