Как добавить две матрицы в 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))
Другие вопросы по тегам