Как добавить две матрицы в haskell
Я пытаюсь использовать библиотеку линейной алгебры Хаскелла для вычисления некоторых собственных значений, но сначала мне нужно сначала попытаться добавить матрицы.
import Numeric.LinearAlgebra.Data
matrix 3 [1,2,3,4,5,6,7,8,9 ] + matrix 3 [1,2,3,4,5,6,7,8,9 ]
(3><3)
[ 2.0, 4.0, 6.0
, 8.0, 10.0, 12.0
, 14.0, 16.0, 18.0 ]
Однако, если я пытаюсь представить другой способ, я получаю сообщение об ошибке
( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ] + ( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ]
No instance for (Element a0) arising from a use of ‘print’
The type variable ‘a0’ is ambiguous
Я даже не уверен насчет matrix 3 [1,2,3,4,5,6,7,8,9 ]
так как я хотел бы указать, что я хочу матрицу 3 × 3. Куда делись остальные 3?
1 ответ
Проблема возникает из-за разницы в типовых сигнатурах.
matrix :: Int -> [ℝ] -> Matrix ℝ
(><) :: Storable a => Int -> Int -> [a] -> Matrix a
Так на самом деле matrix 3 [1,2,3,4,5,6,7,8,9 ]
имеет тип Matrix ℝ
в то время как ( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ]
имеет тип (Num a, Foreign.Storable.Storable a) => Matrix a
, Тогда проблема внезапно решается. Пока не укажете что a
есть, ты не знаешь что (+)
Таким образом, вы не можете на самом деле оценить сумму матрицы (только производить thunks), следовательно, вы не можете распечатать ее.
Быстрое решение состоит в том, чтобы указать тип вашей матрицы
(3 >< 3) ([1..9] :: [ℝ]) + (3 >< 3) ([1..9] :: [ℝ])
какие выходы (с учетом правильного импорта):
(3><3)
[ 2.0, 4.0, 6.0
, 8.0, 10.0, 12.0
, 14.0, 16.0, 18.0 ]
Некоторая информация о бонусах
Я хотел сделать (3 >< 3) ([1..9] :: [Integer]) + (3 >< 3) ([1..9] :: [Integer])
но учтите, что Num
экземпляр Matrix
имеет (Container Matrix a, Num (Vector a)) => Num (Matrix a)
так нам нужно Vector a
также иметь Num
пример. Тем не менее, вы можете проверить, что Vector Integer
не имеет объявления num. Альтернативы, которые работают:
Num (Vector Double)
Num (Vector Float)
Num (Vector (Complex Double))
Num (Vector (Complex Float))