上下文:我在F#中使用.net / c#-library Fare,我尝试使用例如Map.ofSeq.这失败,因为Fare.State不支持比较,因为它没有实现System.IComprable接口(FS0001). 在我的天真,我试图像这样添加IComparable接口:
在我的天真,我试图像这样添加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转换为需要的实际状态
>使用一些技巧将接口IComparable添加到现有类型.
如果第三种选择是不可能的,哪种选择最合适?还有其他选择吗?
虽然State类型确实实现了(通用的)IComparable<'T>,但F#在比较约束中寻找的是(非泛型的)IComparable.前者不是后者的子类型这一事实看起来像是一种可悲的设计选择,但它仍然存在.你的解决方法1和2对我有意义.从设计的角度来看,我更喜欢围绕State的简单记录包装器.但是如果id是唯一的,那么可以想象,如果有点笨拙的话,可以选择其他的解决方法.