Я начинаю идти по пути определения собственных операторов для декартовых произведений и умножения матриц.
С матрицами и векторами, псевдонимами которых являются списки:
type Matrix = float list list
type Vector = float list
Я могу написать свой собственный код инициализации (и получить декартово произведение в сделке), написав
let inline (*) X Y =
X |> List.collect (fun x -> Y |> List.map (fun y -> (x, y)))
let createVector size f =
[0..size - 1] |> List.map (fun i -> f i)
let createMatrix rows columns f =
[0..rows - 1] * [0..columns - 1] |> List.map (fun i j -> f i j)
Пока все хорошо. Проблема в том, что мое определение *
устраняет нормальное определение, хотя моя версия определена только для списков, у которых нет собственного оператора умножения.
В документации http://msdn.microsoft.com/en-us/library/vstudio/dd233204.aspx указано, что "новые операторы имеют приоритет над встроенными операторами". Тем не менее, я не ожидал, что все числовые воплощения будут уничтожены - неужели статическая типизация позаботится об этом?
Я знаю, что можно определить глобальный оператор, который уважает типы, потому что MathNet Numerics использует *
для матричного умножения. Я также хотел бы спуститься по этой дороге, что потребовало бы, чтобы система набрала приоритет для умножения матрицы на декартово произведение типов Matrix
(которые сами являются списками).
Кто-нибудь знает, как это сделать в F #?