Как написать новый тип, который совместим с Array.sum? - PullRequest
5 голосов
/ 19 июля 2010
type Foo(...) =
    ...

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

let sum = Array.sum a

Ответы [ 2 ]

10 голосов
/ 19 июля 2010

Вам нужно добавить несколько членов, которые используются функцией 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)

Функция sum начинается со значения, возвращаемого Zero, а затем добавляетзначения Foo с использованием перегруженного оператора + (average затем делит результат на целое число):

let a = Array.init 10 (fun n -> Foo(n)) 
let sum = Array.sum a 
sum.Value // Returns 45
0 голосов
/ 19 июля 2010

Не возможно.

Если вы хотите использовать любой метод Array (сумма и т. Д.), Вы должны использовать тип массива для хранения данных.

РЕДАКТИРОВАТЬ: Я неправильно истолковал ваш вопрос. Возможно, вы захотите попытаться реализовать определенные операторские перегрузки, такие как +, - и т. Д. Возможно, тип тогда будет поддерживать метод sum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...