Haskell — объявление экземпляра на hMatrix

#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.