如何使用F#discriminated工会的会员与记录会员

如何使用F#discriminated工会的会员与记录会员,f#,record,discriminated-union,F#,Record,Discriminated Union,我正试图以歧视工会为成员制作一份记录,但在制作了“API”记录后,我只能访问工会,而不能访问我放入工会的内容 type DefaultExpr = Expr<int -> Ref<int> -> int -> unit> type Option1Expr = Expr<int -> Ref<int> -> int -> Ref<int> -> unit> type Option2Expr = E

我正试图以歧视工会为成员制作一份记录,但在制作了“API”记录后,我只能访问工会,而不能访问我放入工会的内容

type DefaultExpr = Expr<int -> Ref<int> -> int -> unit>
type Option1Expr = Expr<int -> Ref<int> -> int -> Ref<int> -> unit>
type Option2Expr = Expr<int -> Ref<int> -> int -> Ref<int> -> Ref<int> -> unit>

module Identityless =
    type DefaultExpr = Expr<int -> Ref<int> -> unit>
    type Option1Expr = Expr<int -> Ref<int> -> Ref<int> -> unit>
    type Option2Expr = Expr<int -> Ref<int> -> Ref<int> -> Ref<int> -> unit>

type DefaultU =
    | ID of DefaultExpr
    | NoID of Identityless.DefaultExpr

type Option1U =
    | ID of Option1Expr
    | NoID of Identityless.Option1Expr

type Option2U =
    | ID of Option2Expr
    | NoID of Identityless.Option2Expr


type API =
    {
        Default :   DefaultU
        Option1 :   Option1U
        Option2 :   Option2U
    }


module InclusiveSum =

    let private Default (scan_op:IScanOp) =
        <@ fun (input:int) (output:Ref<int>) -> () @>

    let private Option1 (scan_op:IScanOp) =
        <@ fun (input:int) (output:Ref<int>) (block_aggregate:Ref<int>) -> () @>

    let private Option2 (scan_op:IScanOp) =
        <@ fun (input:int) (output:Ref<int>) (block_aggregate:Ref<int>) (block_prefix_callback_op:Ref<int>) -> () @>


    let api scan_op =
        {
            Default = scan_op |> Default |> DefaultU.NoID                       
            Option1 = scan_op |> Option1 |> Option1U.NoID                 
            Option2 = scan_op |> Option2 |> Option2U.NoID
        }
我想要foo.Default给我使用DefaultExpr

在阅读了一些帖子之后,我想我必须回去做一些模式匹配,这会有点挫败这里的全部目的


那么,如何从API记录中恢复DefaultExpr呢?

因为
API的类型。Default
是有区别的联合类型
Default1U
,这是处理API中的值的唯一(*)方法。默认是通过模式匹配。因此,您需要类似以下内容:

match foo with 
  ID e -> ...
| NoId e -> ...
没有其他方法(*)

(*)忽略

match foo with 
  ID e -> ...
| NoId e -> ...