Я тестирую некоторые методы оптимизации для рендеринга статических воксельных сцен и обучения некоторых Haskell по пути. У меня есть вокселей, определенные какHaskell эквивалент специализации класса в OOP
type Voxel = (VoxelId, Position).
где VoxelId
просто псевдоним для Int
. Поскольку я ожидаю некоторую линейную алгебру по линии, я хотел, чтобы Position
представлял трехмерный вектор. Библиотека, которую я использую (matrix), использует только тип данных Matrix
, но с позицией, имеющей базовый тип Matrix
, упрощает дальнейшие вычисления, поэтому я в порядке.
Однако, это не имеет особого смысла для Position
быть ничем иным, кроме 3-мерного вектора, поэтому я хотел бы, чтобы ограничить Position
для матриц 3x1, поэтому, когда я использую специально Position
в подписи функции, я m гарантированно ожидает либо матрицу 3x1, либо ошибку компиляции.
В C++ или другой язык OO я мог бы сделать что-то вроде этого:
class Matrix
{
Matrix(int rows, int columns)
{}
}
class Position : public Matrix
{
Position()
: Matrix (3, 1)
{}
}
и использовать Position
, когда я ожидаю только 3x1 матрицы и ссылки на Матрица повсюду.
Предположим Matrix
из библиотеки я использую имеет функцию конструктора
matrix :: (rows) -> (columns) -> Matrix
Как я могу повторить это поведение в Haskell без переопределения для Position
все операции Matrix
орудий?
Нет смысла строить неизменный, но пустой вектор в Haskell. Что вы можете сделать, это определить собственный «умный конструктор» (базовая функция), который принимает только, например. '(Double, Double, Double)' и возвращает матрицу. Если вы хотите получить больше статических гарантий, поместите полученную матрицу в оболочку 'newtype' (обратите внимание, что для этого потребуется также определить все операции с матрицами на обертке или разворачивать каждый раз). – chi
Переопределение матричных операций для позиции поражает цель использования сторонней библиотеки, и это то, что я оставлял в качестве последнего решения. Я редактировал оригинальный вопрос, чтобы сделать его более понятным. –
Затем вам приходится вручную разворачивать каждый раз или использовать безопасные принуждения. Или используйте конструктор dumber, как показано ниже. – chi