Подпись функции Haskell и ошибка «Не удалось вывести» компилятора - PullRequest
2 голосов
/ 28 марта 2011

Я пишу библиотеку Haskell, которая использует Data.Vector. Я успешно написал библиотечную функцию, но не знаю, как добавить к ней подпись. Ниже приведен простой пример, иллюстрирующий проблему:

import qualified Data.Vector.Generic as V

-- zip two vectors and return first element as a tuple
test :: (V.Vector v a, Fractional a) => v a -> v a -> (a, a)
test a b = (V.zip a b) V.! 0

Этот код вызывает следующую ошибку компиляции:

Could not deduce (V.Vector v (a, a))
  from the context (V.Vector v a, Fractional a)
  arising from a use of `V.zip' at MyLib.hs:7:12-20
Possible fix:
  add (V.Vector v (a, a)) to the context of
    the type signature for `test'
  or add an instance declaration for (V.Vector v (a, a))
In the first argument of `(V.!)', namely `(V.zip a b)'
In the expression: (V.zip a b) V.! 0
In the definition of `test': test a b = (V.zip a b) V.! 0

Код выполняется, если я закомментирую подпись функции test. Какая здесь правильная подпись?

Я использую GHC 6.12.3, векторную библиотеку 0.7.0.1.

Спасибо.

1 Ответ

3 голосов
/ 28 марта 2011

ghci говорит:

Prelude Data.Vector.Generic> :t \a b -> (Data.Vector.Generic.zip a b) Data.Vector.Generic.! 0
\a b -> (Data.Vector.Generic.zip a b) Data.Vector.Generic.! 0
  :: (Vector v a, Vector v b, Vector v (a, b)) =>
     v a -> v b -> (a, b)

В соответствии с вашим делом, подпись должна быть

test :: (V.Vector v a, Fractional a, V.Vector v (a, a)) => v a -> v a -> (a, a)

(о, и вам нужны FlexibleContexts)

...