上下文:我在F#中使用.net/c#库票价,我尝试使用例如 Map.ofSeq
.此操作失败,因为Fare.State
不支持比较,因为它不实现System.IComprable
接口 (FS0001(。
在我的天真中,我试图像这样添加interface IComparable
:
type Fare.State with
interface IComparable<Fare.State> with
member this.CompareTo obj =
match box obj with
| :? Fare.State as other -> this.Id.CompareTo other.Id
| _ -> invalidArg "obj" "not a State"
但是,这是不可能的,因为 F# 要求应在类型 (FS0909( 的初始声明上声明实现的接口。
我想到了以下解决方法:
- 引入包含
Fare.State
作为其唯一属性并实现IComparable
的包装类型 - 存储 ID 而不是实际
Fare.State
,并在需要时使用 Map 转换为实际状态 - 使用一些技巧将
interface IComparable
添加到现有类型。
如果第三种选择是不可能的,那么哪种选择最合适?还有其他选择吗?
虽然State
类型确实实现了(泛型(IComparable<'T>
,但 F# 在比较约束中寻找的是(非泛型(IComparable
。前者不是后者的子类型这一事实似乎是一个可悲的设计选择,但它将继续存在。
您的解决方法 1 和 2 对我来说很有意义。从设计的角度来看,我更喜欢围绕State
的简单记录包装器。但是,如果 id 是唯一的,则可以使用其他解决方法,如果有点笨拙。