gpt4 book ai didi

f# - 是否可以在受歧视的联合列表中不允许重复的受歧视的联合类型?

转载 作者:行者123 更新时间:2023-12-01 22:56:42 26 4
gpt4 key购买 nike

目标是有一个可区分联合类型的列表,其中无论底层数据如何,列表中只允许一种特定情况的类型,例如:

type Car = 
| Honda
| Tesla of string

let carList = [Honda; Tesla("Tesla"); Tesla(""); Tesla("Tesla")]

//List should look like
let correctCarList = [Honda; Tesla ("Tesla")]

在上述情况下,它们应该只是列表中允许的一个类型特斯拉元素,即使与该情况关联的基础数据不同,它仍然是重复的特斯拉类型。

我正在努力看看这是否可行,如果我创建一个集合,该集合将只禁止类型和基础数据相同的重复类型(因此它会删除无关的 Tesla("tesla"),因为那里是其中两个。是否可以仅按类型过滤掉 DS 案例?有没有办法只允许从 DS 类型创建一个描述符?

最佳答案

你可以通过在类型上实现你自己的自定义比较来做到这一点,但我建议你要非常小心,因为它可能并不总是按照你期望的方式运行:

[<CustomComparison; CustomEquality>]
type Car =
| Honda
| Tesla of string

member private carA.CompareTo(carB : obj) =
match carA, carB :?> Car with
| Honda, Tesla _ -> -1
| Tesla _, Honda -> 1
| _ -> 0 // any Tesla equals any other Tesla

interface IComparable with
member carA.CompareTo(carB) =
carA.CompareTo(carB)

override carA.Equals(carB) =
carA.CompareTo(carB) = 0

override car.GetHashCode() =
match car with
| Honda -> 0
| Tesla _ -> 1

测试代码:

set [Honda; Tesla("Tesla"); Tesla(""); Tesla("Tesla")]
|> printfn "%A" // set [Honda; Tesla "Tesla"]

(Tesla("Tesla") = Tesla(""))
|> printfn "%A" // true!

关于f# - 是否可以在受歧视的联合列表中不允许重复的受歧视的联合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72994806/

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