как определить перегрузки операторов без перезаписи существующих операторов - PullRequest
0 голосов
/ 11 июня 2018

Как можно перегрузить базовые операторы, такие как (+, -, *), не перезаписывая их существующие определения?Читая некоторые другие темы на эту тему, я не мог понять, что делать.В частности, я хочу определить матричные операции непосредственно для типов Array2D.MathNet.Numerics каким-то образом удается сделать это для своих типов Matrix и Vector, но не уверен, как это сделать.Определение регулярных функций вместо использования операторов полностью fubars логики в линейной алгебре тяжелых приложений.

type Array() =
    static member (+) (A : float[,], B : float[,]) =
        let r = A.GetLength 0
        let c = A.GetLength 1
        let C = Array2D.create r c 0.
        for i in 0..r-1 do
            for j in 0..c-1 do
                C.[i, j] <- A.[i, j] + B.[i, j]
        C


let a1 = Array2D.create 4 4 1.
let a2 = Array2D.create 4 4 1.
let a3 = a1 + a2   // type float[,] does not support the operator '+'
let y = 2 + 3      // don't want this overridden by something like a 'let inline...'

1 Ответ

0 голосов
/ 11 июня 2018

MathNet.Numerics не должно иметь особых проблем, если они предоставляют операторы для своих собственных типов, как часть их определения.

То, что вы пытаетесь сделать, - это предоставить оператору метод расширения - я не думаю, что в настоящее время это возможно.

Самый простой выход - это предоставить немного другой оператор,скажем +., чтобы не было конфликтов, но код все еще остается довольно простым для отслеживания.Это то, что OCaml делает, например, чтобы различать операторы int и float (а F # дает вам много места для выбора символов для пользовательских операторов).

let inline (+.) (A: float[,]) (B: float[,]) = 
    ...

let a3 = a1 +. a2 

Существуют и другие решения: вы можете использовать объединение одного регистра, чтобы обернуть двумерные массивы и определить оператор как член этого типа, или вы можете использовать SRTP, чтобы соединить оператора ссуществующего типа, и он будет встроен во время компиляции, но такой путь также затеняет логику тем или иным способом.

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