gpt4 book ai didi

inheritance - F# 将额外的情况添加到外部 DU

转载 作者:行者123 更新时间:2023-12-02 09:34:25 27 4
gpt4 key购买 nike

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

但这需要您通过添加接口(interface)来更改 OrDU

关于inheritance - F# 将额外的情况添加到外部 DU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28545500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com