F# 测试某个值是否是受歧视的联合的特定实例
如果我有一个受歧视的联盟F# 测试某个值是否是受歧视的联合的特定实例,f#,F#,如果我有一个受歧视的联盟 type Result<'T,'U> = | Success of 'T | Failure of 'U 我能把它做成一行这样吗 let success = fun x -> x = Success(_) 最后一行没有编译,但我认为它表明了我的意图编译后的表单会为每种情况公开属性,如issucess/IsFailure,但不幸的是,在这种情况下,它们只在其他.NET语言中可用。你所拥有的一切都是最好的 有趣的是,试图定义这些成员也行不通: type
type Result<'T,'U> =
| Success of 'T
| Failure of 'U
我能把它做成一行这样吗
let success = fun x -> x = Success(_)
最后一行没有编译,但我认为它表明了我的意图编译后的表单会为每种情况公开属性,如
issucess/IsFailure
,但不幸的是,在这种情况下,它们只在其他.NET语言中可用。你所拥有的一切都是最好的
有趣的是,试图定义这些成员也行不通:
type Result<'T,'U> =
| Success of 'T
| Failure of 'U
member this.IsSuccess = true //ERROR
类型结果=
|T的成功
|"U"的失败
成员this.issucess=true//错误
无法定义成员“IsSuccess”,因为名称为“IsSuccess”
与中工会案例“成功”的默认扩展冲突
此类型或模块
在我看来,如果它们存在于F#中,即不能定义同名的成员,那么它们也应该是可用的。可能是拉取请求的候选者?编译后的表单会为每种情况公开属性,如
issucess/IsFailure
,但不幸的是,在这种情况下,它们仅在其他.NET语言中可用。你所拥有的一切都是最好的
有趣的是,试图定义这些成员也行不通:
type Result<'T,'U> =
| Success of 'T
| Failure of 'U
member this.IsSuccess = true //ERROR
类型结果=
|T的成功
|"U"的失败
成员this.issucess=true//错误
无法定义成员“IsSuccess”,因为名称为“IsSuccess”
与联盟案例“成功”默认增强冲突
此类型或模块
在我看来,如果它们存在于F#中,即不能定义同名的成员,那么它们也应该是可用的。可能是拉取请求的候选者?没有简单的方法,但您可以通过反射来实现。使用中的
isUnionCase
函数,我们可以编写:
let success = isUnionCase <@ Success @>
正如@Daniel所说,编译器生成的
Is*
函数应该公开。有一个关于用户的声音,也许你应该投票,以便在F#4.0中实现它。没有简单的方法,但你可以通过反射来实现。使用中的isUnionCase
函数,我们可以编写:
let success = isUnionCase <@ Success @>
正如@Daniel所说,编译器生成的
Is*
函数应该公开。有一个关于用户的声音,也许你应该投票,以便在F#4.0中实现它。你可以创建一个通用函数,帮助你:
let ItIsSucess value =
match value with
| Success(_) -> true
| _ -> false
这样你就可以写一些东西,比如:
let expr = ...
if ItIsSucess expr than
"do something"
else
"do nothing"
您还可以考虑使用更通用的函数,并使用反射对任何类型进行测试。但这并不容易,我不建议为这个简单的任务这样做。反射可能会破坏F#中类型安全的好处,因此请注意使用它。您可以创建一个通用函数来帮助您:
let ItIsSucess value =
match value with
| Success(_) -> true
| _ -> false
这样你就可以写一些东西,比如:
let expr = ...
if ItIsSucess expr than
"do something"
else
"do nothing"
您还可以考虑使用更通用的函数,并使用反射对任何类型进行测试。但这并不容易,我不建议为这个简单的任务这样做。反射可能会破坏F#中类型安全性的好处,因此如果使用它,请注意。注意选项类型确实具有
IsSome
和IsNone
属性,我查看了源代码,发现类型被修饰[]
将该属性应用于结果类型,我发现我能够定义一个issucess
属性。此属性“关闭为该类型生成的公共语言基础结构(CLI)类生成的标准助手成员tester、构造函数和访问器成员”,因此请谨慎使用
您还可以从选项类型中获得另一个提示,定义结果模块,定义issucess
和isFailure
函数:
module Result =
let isSuccess = function Success _ -> true | _ -> false
let isFailure = function Failure _ -> true | _ -> false
注意到选项类型确实有
IsSome
和IsNone
属性,我查看了源代码,发现类型是修饰的[]
将该属性应用于结果类型,我发现我能够定义一个issucess
属性。此属性“关闭为该类型生成的公共语言基础结构(CLI)类生成的标准助手成员tester、构造函数和访问器成员”,因此请谨慎使用
您还可以从选项类型中获得另一个提示,定义结果模块,定义issucess
和isFailure
函数:
module Result =
let isSuccess = function Success _ -> true | _ -> false
let isFailure = function Failure _ -> true | _ -> false
有关定义可在F#code中访问的IsSuccess实例成员的方法,请参见我的答案。有关定义可在F#code中访问的IsSuccess实例成员的方法,请参见我的答案。请注意,您可以使用
DefaultAugmentationAttribute(false)
删除自动生成的IsSuccess
。请注意,您可以使用DefaultAugmentationAttribute(false)
删除自动生成的IsSuccess
。