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.

Другие вопросы по тегам