如何将 F# 区分联合的成员与记录成员一起使用



我试图以受歧视的工会作为成员制作记录,但是在制作了"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
        }

所以当我制作我的 api 时...

let foo = InclusiveSum.api (scan_op ADD 0)

我想要福。默认给我我的 DefaultExpr 供我使用

在阅读了一些帖子之后,我想我将不得不回去做一些模式匹配,这会破坏这里的整个目的......

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

由于API.Default的类型是可区分的联合类型Default1U,这是处理 API 内部值的唯一(*)方法。默认为模式匹配。所以你需要这样的东西:

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

没有其他办法(*)。

(*) 忽略反射

相关内容

  • 没有找到相关文章

最新更新