首页 文章

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

提问于
浏览
5

我希望能够使用静态方法从其他库扩展类型以启用泛型算法 . 以微软新推出的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#编译器中存在此限制?

(编辑:基本上同样的问题被问到previously . )

1 回答

  • 6

    目前无法在类型扩展中定义运算符重载 . 这有一个F# language user voice item(投票相当多)所以这可能会在F#的未来版本中发生变化(我认为这将是很好的补充,非常适合F#设计) .

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

相关问题