F# 向外部 DU 添加额外案例

F# add extra cases to external DU

假设我有一个 DU ,我不能(或不想)更改它:

type OrDU =
    | A
    | B
    | C

现在在另一个程序中我需要一个 DU,它与上面的相同,只是它需要一些额外的案例。

type ExtraDU = 
    inherit OrDU
    | D
    | E

但是,无法扩展 DU。最好的解决方案是什么? 理想情况下,我想要简单的互操作,即 OrDu 可以用作 ExtraDU,并且没有额外情况的 ExtraDU 可以转换回 OrDU

您可以像这样扩展它:

type ExtraDU =
| OrDU of OrDU
| D
| E

来自 http://theburningmonk.com/2012/03/f-extending-discriminated-unions-using-marker-interfaces 的另一种方法如下所示:

type IMessage = interface end

type OrDU =
    | A | B | C
    interface IMessage

type ExtraDU =
    | D | E
    interface IMessage


let f1 = function
    | A -> "A"
    | B -> "B"
    | C -> "C"

let f2 = function
    | D -> "D"
    | E -> "E"

let f (msg : IMessage) =
    match msg with
    | :? OrDU    as a -> f1 a
    | :? ExtraDU as b -> f2 b
    | _ -> failwith "Invalid type"

然而,这需要您通过添加接口来更改 OrDU