Haskell - Несовместимость типов после квалифицированного импорта
Я использую hMatrix, и первые строки моего кода:
import Numeric.LinearAlgebra
import qualified Data.Vector as V
Проблема в том, что в моем коде тип вектора V.Vector
, но некоторые методы, определенные hMatrix, имеют тип Vector -> ...
и GHC не понимает, когда я пытаюсь использовать эти методы, говоря, что они не определены для типа V.Vector
, Как я могу решить эту проблему?
Обновить:
Из документации hMatrix:
Vector
тип являетсяStorable
vector из векторного пакета Романа Лещинского, поэтому все инструменты обработки массивов, предоставляемые этой библиотекой, доступны напрямую.
Тем не менее, некоторые основные операторы, такие как (++)
(который присутствует в Data.Vector.Storable
) не включены в hMatrix. Нельзя ли использовать их из hMatrix или есть какой-то простой способ сообщить компилятору, что эти типы одинаковы?
3 ответа
Вы можете добавить явный импорт для Vector
тип:
import Numeric.LinearAlgebra
import qualified Data.Vector as V
import Data.Vector (Vector)
Хотя я не знал, что внешние модули могут сломаться в зависимости от того, как вы импортируете модули, от которых они зависят.
Hmatrix использует свой собственный Data.Packed.Vector
типа, и это отличается от Data.Vector
,
Либо с помощью Data.Packed.Vector
в вашем коде или конвертации Data.Vector
в Data.Packed.Vector
до вызова функции будет работать.
Обратите внимание, что вы не можете сломать Hmatrix только потому, что вы импортируете другой модуль. Вы просто несоответствие типов как vector
предоставляет различные типы векторов, в том числе .Generic
интерфейс, который работает для всех тех.
Вы, вероятно, имеете что-то вроде
import Data.Vector
f :: Vector Int -> Vector Int
f = whatever
Если вы импортируете Data.Vector.Generic
Вы можете написать функции, которые работают для всех векторных типов, включая те, которые используются hmatrix.
import Data.Vector.Generic
f :: Vector Int -> Vector Int
f xs = xs ++ empty
должен работать с векторами Hmatrix.