我有一个名为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)
答案 0 :(得分:2)
我认为原因很简单:它不适用于运营商,因为它们不是继承的。对于解决方法,这应该有效:
let foo (v : #Vector) (w : #Vector) = (v :> Vector) + (w :> Vector)
但是,我不确定这是否真的是你需要的。 Vector是一个抽象类吗?如何实施?