F#将额外的案例添加到外部DU

时间:2015-02-16 16:03:22

标签: inheritance f# discriminated-union

说我有一个DU,我不能(或不想)改变:

type OrDU =
    | A
    | B
    | C

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

type ExtraDU = 
    inherit OrDU
    | D
    | E

但是,DU不能延长。什么是最好的解决方案? 理想情况下,我想要简单的互操作,OrDu可以用作ExtraDU,而ExtraDU没有额外的情况可以转换回OrDU

1 个答案:

答案 0 :(得分:3)

您可以像这样扩展它:

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