Как использовать член дискриминируемого объединения 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
        }

Поэтому, когда я делаю мой апи...

let foo = InclusiveSum.api (scan_op ADD 0)

Я хочу, чтобы foo.Default дал мне использовать DefaultExpr

Прочитав несколько постов, я думаю, что мне придется вернуться и выполнить сопоставление с шаблоном, что отчасти побьет всю цель здесь...

Так как же вернуть свой DefaultExpr из записи API?

1 ответ

Решение

Так как тип API.Default является дискриминационным типом объединения Default1Uединственный (*) способ работы со значением внутри API.Default - сопоставление с образцом. Так что вам нужно что-то вроде:

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

Другого пути нет(*).

(*) Игнорирование отражения

Другие вопросы по тегам