5

我希望能够使用静态方法从其他库扩展类型以启用通用算术。VectorN以Microsoft新推出的 SIMD 友好的固定大小类型为例。他们定义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# 编译器中存在此限制?

(编辑:基本上之前问同样的问题。)

4

1 回答 1

6

目前无法在类型扩展中定义运算符重载。对此有一个F# 语言用户语音项目(有相当多的投票),因此这可能会在 F# 的未来版本中发生变化(我认为这将是很好的补充,非常适合 F# 设计)。

如果你今天绝对需要这样的东西,你可以为你的类型创建一个轻量级的包装器来添加运算符,或者你可以使用一个(有点可怕的)技巧,让你用一个新的重载运算符隐藏标准运算符。以下问题有两个示例:F# 中的全局运算符重载

于 2014-08-17T08:39:30.167 回答