【问题标题】:F# Operator ResolutionF# 运算符解析
【发布时间】:2010-11-30 08:11:10
【问题描述】:

我有一个名为 Vector 的类,它实现了许多运算符,例如 + 和属性,例如 Count。 Vector 也由继承自 Vector 的 DenseVector、SparseVector 等类进行子类型化。现在在 F# 中,当我编写以下代码时

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

对于“foo”,我收到警告: “这种构造导致代码比其类型注释所指示的更通用。使用'#','_'或其他类型注释所暗示的类型变量在或附近......已被限制为类型'Vector ’。” 而“bar”工作得很好。

我不明白为什么灵活类型约束适用于属性但对于运算符解析却有问题。任何解释/想法/解决方法?

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

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

【问题讨论】:

  • 这是一元 +。没有leftSide?
  • 对不起,我复制粘贴错了运算符

标签: .net inheritance f# static


【解决方案1】:

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

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

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

【讨论】:

  • 我一直在寻找关于不继承运算符的子类型的解释;你有这个事实的指针吗?
  • 操作符在 .NET 中基本上被定义为静态方法; .NET 中永远不会继承静态成员。
猜你喜欢
  • 1970-01-01
  • 2010-10-27
  • 2012-04-20
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2015-07-09
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多