F#操作员解析

时间:2009-09-22 08:50:47

标签: .net inheritance f# static

我有一个名为Vector的类,它实现了许多运算符,如+和属性,如Count。 Vector也是由DenseVector,SparseVector等继承Vector的类子类型化的。现在在F#中写下以下内容

let foo (v : #Vector) (w : #Vector) = v + w
let bar (v : #Vector) (w : #Vector) = v.Count + w.Count

对于“foo”我收到警告: “这种结构导致代码的通用性低于其类型注释所表示的。通过使用'#','_'或其他类型注释隐含的类型变量被限制为类型'Vector ”“。 而“酒吧”工作正常。

我不明白为什么灵活类型约束对属性有效,但是对于操作员解析它有麻烦。任何解释/想法/解决方法?

编辑我的Vector类是抽象的,并且有一个带有以下签名的运算符:

public static Vector operator +(Vector leftSide, Vector rightSide)

1 个答案:

答案 0 :(得分:2)

我认为原因很简单:它不适用于运营商,因为它们不是继承的。对于解决方法,这应该有效:

let foo (v : #Vector) (w : #Vector) = (v :> Vector) + (w :> Vector)

但是,我不确定这是否真的是你需要的。 Vector是一个抽象类吗?如何实施?