Я пишу крошечную матричную библиотеку (в основном методы-обертку) в F # и имею проблему перегрузки статических операторских методов, при этом F # выбирает перегрузку, на которую я ее не намеревался.Как использовать перегруженные статические операторы
У меня есть модуль, где я определил правое умножение матрицы с вектором:
[<AutoOpen>]
module MatrixOps =
let (*) (matrix : IMatrix) (vector : IVector) =
(...)
Это позволяет мне писать такие вещи, как, например, A * v, где A - IMatrix, а v - IVector. Тем не менее, я теперь добавить следующую строку ниже пусть связывания выше:
let z = 1.0 * 2.0
и затем F # компилятор идентифицирует это как ошибку. Наведите курсор на «1.0», я получаю: «Тип« float »несовместим с типом« IMatrix », и аналогичным образом, паря над« 2.0 », я получаю:« Тип «float» несовместим с типом ' IVector». Что здесь происходит, похоже, что компилятор F # не применяет оператор умножения для float и вместо этого применяет оператор для IMatrix и IVector. Если я вместо этого напишу
let z = (1.0 : float) * (2.0 : float)
проблема сохраняется, поэтому добавление явно выраженных аннотаций не помогает. Как я могу гарантировать, что F # выбирает оператор плавающего умножения вместо оператора IMatrix/IVector, который я определил выше?
Вы хотите сделать перегруз статическим членом типа одного из объектов, тогда он работает так, как вы хотите –
Хорошо. Но есть ли другой путь? Если метод умножения находится на интерфейсе IMatrix или IVector, тогда я буду вводить нежелательную зависимость. –
Это не зависимость. Вам все равно нужны типы –