为什么我们不能使用类型扩展满足 F# 静态成员约束?



我希望能够使用静态方法从其他库扩展类型以启用泛型算法。例如,以Microsoft新创建的simd友好固定大小的VectorN类型为例。他们定义了Zero,他们定义了(+),他们定义了(/),但我不能在他们身上使用Array.average,因为他们没有定义DivideByInt,我很乐意:

open System.Numerics
type Vector2f with 
  static member DivideByInt (v:Vector2f) (i:int) = v / Vector2f(single i, single i)
let bigArray : Vector2f[] = readABigFile()
printf "the average is %A" (Array.average bigArray)

但是它不让我编译,抱怨

error FS0001: The type 'Vector2f' does not support the operator 'DivideByInt'

为什么f#编译器存在这个限制?

目前不能在类型扩展中定义操作符重载。关于这一点,有一个f#语言用户的意见(有相当多的投票),所以这可能会在f#的未来版本中改变(我认为这将是一个很好的补充,非常适合f#的设计)。

如果你现在绝对需要这样的东西,你可以为你的类型创建一个轻量级的包装器来添加操作符,或者你可以使用一个(有点可怕的)技巧,让你用一个新的重载操作符隐藏标准操作符。下面的问题有两个例子:f#

中的全局操作符重载

最新更新