扩展F#中的枚举类型

时间:2013-04-06 11:29:50

标签: f# extension-methods

与F#相关的另一个问题是"Type extensions"

似乎无法在F#中扩展枚举。我使用C# Extensions Methods来扩展枚举:添加范围验证逻辑,返回字符串表示的方法等。

不幸的是,似乎只能扩展歧视联盟但无法扩展简单的枚举

1。内在延伸

// CustomEnum.fs
module CustomEnumModule

type CustomEnum = 
    | Value1 = 1
    | Value2 = 2

// Trying to split definition of the enum
type CustomEnum with 
    | Value3 = 3

错误:“错误FS0010:意外符号'|'在成员定义“

2。可选扩展名

// CustomEnumEx.fs
open CustomEnumModule

type CustomEnum with
    member public x.PrintValue() =
        printfn "%A" x

错误:“错误FS0896:枚举不能包含成员”

对我来说这似乎很奇怪,因为(1)我们可以将简单的枚举视为全功能区分联合的一个特例,我们可以扩展有区别的联合,以及(2)扩展.NET枚举是一个向现有基础架构添加一些功能(包括FP功能)的好方法。

这种行为是故意的还是实施中的简单错误?

P.S。不幸的是F# Spec在这方面是沉默的,或者至少我找不到任何证据来证明那里的一种或另一种行为。

1 个答案:

答案 0 :(得分: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
相关问题