2014-06-25 1 views
1

Я использую функцию fromBlocks из hMatrix над списком, элементы которого определяются функциями типа Int -> Int -> Int -> Matrix Int. Тем не менее, GHC сетует о том, что:Haskell - Объявление экземпляра hMatrix

No instance for (Element Int) arising from a use of `fromBlocks' 
    Possible fix: add an instance declaration for (Element Int) 
    In the expression: 
     fromBlocks [[matrixCreate n m d], [rowZero n m d]] 

Я пытался сказать GHC тип результата этого вычисления с :: Matrix Int, но он не работает, и я не понимаю, как объявить тип при использовании функция.

ответ

1

Нет - там действительно нет экземпляра для Element Int - смотрите здесь: http://hackage.haskell.org/package/hmatrix-0.16.0.3/docs/Numeric-LinearAlgebra-HMatrix.html#t:Element

Просто пойти на Matrix Float или Matrix Double, если вы можете

+0

Отлично, спасибо! – guaraqe

+0

Альберто (автор пакета) согласен с vivian в том, что этот ответ неверен. – vivian

+0

Тогда, может быть, дайте подсказку, что не так, и мы можем это исправить - о, подождите, пока вы просто хотите нажать свой собственный ответ ... – Carsten

0

Просто объявить instance Element Int, как описано в [1]. Будьте предупреждены, что многие функции fancier определены только для Double и Float.

[1] https://github.com/albertoruiz/hmatrix/issues/28

Редактировать: добавить комментарий Альберто:

instance Element Int 

a = (2><3) [1..] :: Matrix Int 

z = (1><1) [0] :: Matrix Int 

m = fromBlocks [[a,z],[a,a]] 

> m 

(4><6) 
[ 1, 2, 3, 0, 0, 0 
, 4, 5, 6, 0, 0, 0 
, 1, 2, 3, 1, 2, 3 
, 4, 5, 6, 4, 5, 6 ] 
+0

Это правильно. Вы можете сделать что-то вроде этого: экземпляр элемента Int а = (2><3) [1 ..] :: Матрица Int г = (1><1) [0] :: Матрица Int м = fromBlocks [[а, г], [а, а]] > м (4><6) [1, 2, 3, 0, 0, 0 , 4, 5, 6, 0 , 0, 0 , 1, 2, 3, 1, 2, 3 , 4, 5, 6, 4, 5, 6] Но для элементов Int очень мало полезных операций. –