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