首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#:将接口(如IComparable)添加到现有类型(例如,从库(如Fare)中)

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

Stack Overflow用户
提问于 2016-05-03 13:22:37
回答 1查看 451关注 0票数 6

上下文:我在F#中使用.NET/c#-库车费,并尝试使用例如Map.ofSeq。这失败了,因为Fare.State不支持比较,因为它没有实现System.IComprable接口(FS0001)。

在我的天真中,我试图像这样添加interface IComparable

代码语言:javascript
复制
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,并在需要时使用映射将其转换为实际状态
  3. 使用一些技巧将interface IComparable添加到现有类型中。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-03 14:29:20

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

你的解决办法1和2对我来说是有道理的。从设计的角度来看,我更喜欢围绕State使用一个简单的记录包装器。但是如果is是唯一的,那么使用其他解决方法是可以想象的,如果有点笨重。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37005400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档