F#:将接口(如 IComparable)添加到现有类型(例如,从 Fare 等库中)



上下文:我在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( 的初始声明上声明实现的接口。

我想到了以下解决方法:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新