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

dte*_*ech 2 inheritance f# discriminated-union

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

type OrDU =
    | A
    | B
    | C
Run Code Online (Sandbox Code Playgroud)

现在在另一个程序中,我需要一个 DU,它与上述相同,但需要一些额外的情况。

type ExtraDU = 
    inherit OrDU
    | D
    | E
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ald 5

你可以像这样扩展它:

type ExtraDU =
| OrDU of OrDU
| D
| E
Run Code Online (Sandbox Code Playgroud)

来自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"
Run Code Online (Sandbox Code Playgroud)

但是,这需要您通过添加接口来更改 OrDU