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
假设我有一个 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