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