与 F# 功能相关的另一个问题称为“类型扩展” http://msdn.microsoft.com/en-us/library/dd233211.aspx.
在 F# 中扩展枚举似乎是不可能的。我用C# 扩展方法 http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx扩展枚举有很多:添加范围验证逻辑、返回字符串表示的方法等。
不幸的是,似乎只能扩大受歧视的工会,但无法扩展简单的枚举:
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)我们可以将简单的枚举视为全功能歧视联合的特例,并且我们can扩展可区分联合和 (2) 扩展 .NET 枚举是向现有基础设施添加一些功能(包括 FP 功能)的好方法。
这种行为是故意的还是实施中的简单错误?
附:很遗憾F# Spec http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html在这方面保持沉默,或者至少我找不到那里的一种或另一种行为的任何证据。
可以创建与类型同名的模块,类似于扩展类型:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)