6

上下文:我在 F# 中使用 .net/c#-library Fare,我尝试使用 eg Map.ofSeqFare.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)。

我想到了以下解决方法:

  1. 引入包含 aFare.State 作为其唯一属性并实现的包装器类型IComparable
  2. 存储 ID 而不是实际的 ID,Fare.State并在需要的地方使用 Map 转换为实际状态
  3. 使用一些技巧添加interface IComparable到现有类型。

如果第三个选项不可能,那么哪个选项最合适?还有其他选择吗?

4

1 回答 1

6

虽然Statetype 确实实现IComparable<'T>了 (generic) ,但 F# 在比较约束中寻找的是 (non-generic) IComparable。前者不是后者的子类型这一事实似乎是一个可悲的设计选择,但它仍然存在。

您的解决方法 1 和 2 对我来说很有意义。从设计的角度来看,我更喜欢一个简单的记录包装器State。但是,如果 id 是唯一的,则可以使用其他解决方法,如果有点笨拙的话。

于 2016-05-03T14:29:20.410 回答