Почему мы не можем удовлетворить статические ограничения членов F# с помощью расширений типов?

Я хотел бы иметь возможность расширять типы из других библиотек статическими методами, чтобы включить общую арифметику. Взять, к примеру, недавно выпущенный SIMD-ориентированный фиксированный размер VectorN типы от Microsoft. Они определяют 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#?

(Изменить: по сути, тот же вопрос был задан ранее.)

1 ответ

Решение

В настоящее время невозможно определить перегрузку оператора в расширении типа. Для этого есть пользовательский голосовой элемент на языке F# (с большим количеством голосов), и поэтому это может измениться в будущих версиях F# (я думаю, что это было бы отличным дополнением, которое хорошо сочетается с дизайном F#).

Если вам сегодня абсолютно необходимо что-то подобное, вы можете либо создать облегченную оболочку для своего типа, которая добавляет операторы, либо использовать (несколько пугающий) прием, который позволяет скрыть стандартный оператор с новым перегруженным оператором. Следующий вопрос имеет оба примера: Глобальная перегрузка операторов в F#

Другие вопросы по тегам