Как использовать член дискриминируемого объединения 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 -> ...
Другого пути нет(*).
(*) Игнорирование отражения