Хаскель-идиоматичнее говорить на самом деле не о матрицах , размерность которых является просто числом, которое мало что говорит вам о структуре отображения / пространств, между которыми он отображается,Вместо этого матричное умножение лучше всего рассматривать как операцию составления категории в категории Vect k .Векторные пространства естественно представлены типами Haskell;библиотека vector-space
имеет это в течение длительного времени.
Как набор линейных функций, проверка размеров является следствием проверки типов, которая в любом случае выполняется для функции Haskell.композиции.И не только это, вы также можете различать различные пространства, которые могут быть несовместимы, несмотря на то, что имеют одинаковое измерение - например, сами матрицы образуют векторное пространство ( тензорное пространство ), но пространство 3 × 3матрицы на самом деле не совместимы с пространством 9-элементных векторов.В Matlab и других «языках массивов» работа с линейными отображениями в пространстве линейного отображения требует подверженного ошибкам изменения формы между тензорами различного ранга;конечно, мы не хотим этого в Haskell!
Есть одна загвоздка: чтобы эффективно реализовать эти функции, вы не можете просто иметь функции между любыми пробелами , но нужно своего рода базовое представлениеэто все еще похоже на матрицу.Это работает только тогда, когда все разрешенные пробелы фактически являются векторными пространствами, поэтому вы не можете использовать стандартный Category
класс , поскольку для этого требуется id
между любыми двумя типами.Вместо этого вам нужен класс категории, который фактически ограничен векторными пространствами.Это не очень сложно выразить в современном Haskell.
Две библиотеки, которые пошли по этому пути:
- Подпрограмма Майка Избицкого , которая использует матрицы hmatrix внутрино предоставляет хороший высокоуровневый интерфейс.
- Мой собственный linearmap-category , который использует выделенную реализацию тензоров, охватываемых каждым пробелом.