扩展F#中的枚举类型

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在这方面是沉默的,或者至少我找不到任何一种或那种行为的证据.

Phi*_*ord 7

可以创建一个名称与类型相同的模块,类似于扩展类型:

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)