如何编写与Array.sum兼容的新类型?

Str*_*ger 5 f#

type Foo(...) =
    ...

let a = Array.create 10 (new Foo())

let sum = Array.sum a
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 10

您需要添加sum函数使用的一些成员来进行计算:

type Foo(value:int) = 
  member x.Value = value
  // Two members that are needed by 'Array.sum'
  static member (+) (a:Foo, b:Foo) = Foo(a.Value + b.Value)
  static member Zero = Foo(0)
  // Not needed for 'Array.sum', but allows 'Array.average'
  static member DivideByInt(a:Foo, n:int) = Foo(a.Value / n)
Run Code Online (Sandbox Code Playgroud)

sum函数以返回的值开始,Zero然后添加Foo使用重载+运算符的值(average然后将结果除以整数):

let a = Array.init 10 (fun n -> Foo(n)) 
let sum = Array.sum a 
sum.Value // Returns 45
Run Code Online (Sandbox Code Playgroud)