5

另一个与 F# 功能相关的问题称为“类型扩展”

在 F# 中扩展枚举似乎是不可能的。我经常使用C# 扩展方法来扩展枚举:添加范围验证逻辑、返回字符串表示的方法等。

不幸的是,似乎只能扩展有区别的联合,但不可能扩展简单的枚举

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-功能)到现有的基础设施。

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

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

4

1 回答 1

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
于 2013-04-06T15:36:07.097 回答