与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在这方面是沉默的,或者至少我找不到任何证据来证明那里的一种或另一种行为。
答案 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