上下文:我在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的包装器类型。Fare.State,并在需要时使用映射将其转换为实际状态interface IComparable添加到现有类型中。如果第三种选择是不可能的,那么哪一种选择最合适?还有其他选择吗?
发布于 2016-05-03 14:29:20
虽然State类型确实实现了(泛型) IComparable<'T>,但是F#在比较约束中查找的是(非泛型) IComparable。前者不是后者的一个子类型,这一事实似乎是一个可悲的设计选择,但它仍然存在。
你的解决办法1和2对我来说是有道理的。从设计的角度来看,我更喜欢围绕State使用一个简单的记录包装器。但是如果is是唯一的,那么使用其他解决方法是可以想象的,如果有点笨重。
https://stackoverflow.com/questions/37005400
复制相似问题