说我有一个DU,我不能(或不想)改变:
type OrDU =
| A
| B
| C
现在在另一个程序中,我需要一个DU,除了需要一些额外的情况外,它与上面相同。
type ExtraDU =
inherit OrDU
| D
| E
但是,DU不能延长。什么是最好的解决方案?
理想情况下,我想要简单的互操作,OrDu
可以用作ExtraDU
,而ExtraDU
没有额外的情况可以转换回OrDU
。
答案 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