当前位置 : 主页 > 手机开发 > 其它 >

继承 – F#:将接口(如IComparable)添加到现有类型(例如来自像Fare这样的库)

来源:互联网 收集:自由互联 发布时间:2021-06-19
上下文:我在F#中使用.net / c#-library Fare,我尝试使用例如Map.ofSeq.这失败,因为Fare.State不支持比较,因为它没有实现System.IComprable接口(FS0001). 在我的天真,我试图像这样添加IComparable接口:
上下文:我在F#中使用.net / c#-library Fare,我尝试使用例如Map.ofSeq.这失败,因为Fare.State不支持比较,因为它没有实现System.IComprable接口(FS0001).

在我的天真,我试图像这样添加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是唯一的,那么可以想象,如果有点笨拙的话,可以选择其他的解决方法.

网友评论