#haskell #hmatrix
#haskell #hmatrix
Вопрос:
Я использую функцию fromBlocks
из hMatrix над списком, элементы которого определяются функциями типа Int -> Int -> Int -> Matrix Int
. Однако GHC жалуется, говоря, что:
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
, если сможешь
Комментарии:
1. Альберто (автор пакета) согласен с Вивиан в том, что этот ответ неверен.
2. Тогда, возможно, дайте подсказку, что не так, и мы сможем это исправить — о, подождите, вы просто хотите выдвинуть свой собственный ответ…
Ответ №2:
Просто объявите instance Element Int
, как описано в [1] . Имейте в виду, что многие из более популярных функций определены только для 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 ]
Комментарии:
1. Это правильно. Вы можете сделать что-то вроде этого: элемент экземпляра Int a = (2><3) [1..] :: Матрица Int z = (1><1) [0] :: Матрица Int m = Из блоков [[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 ] Но полезных очень малооперации для элементов Int.