Почему мы не можем удовлетворить статические ограничения членов 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#