Haskell, даже несмотря на то, что мой тип не указан, я получаю эту ошибку: не удалось сопоставить тип `a 'с` [a]', `a '- это переменная жесткого типа, привязанная к

Итак, я понимаю, что это возможный повторяющийся вопрос, так как в Stack Overflow было зарегистрировано несколько таких ошибок, но ни одно из решений, похоже, не применимо к моей проблеме.

Итак, у меня есть следующая функция:

elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
    where yminus1 = y - 1

Если вам интересно, это проблема 3 из 99 проблем Haskell . Цель функции - принять в качестве входных данных список и индекс и вернуть значение по этому индексу (начиная с 1). Мне не нужно решение проблемы, если бы я хотел, я бы просто посмотрел на предоставленные. Но я получаю сообщение об ошибке, которого не понимаю. Я использую eclipseFP, плагин eclipse для haskell, и он подчеркивает части функции «[x: _]» и «[x: xs]» со следующей ошибкой:

Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a

Во всех потоках, обсуждающих эту ошибку что я рассмотрел, проблема обычно возникает, когда кто-то пытается дать неправильный вывод для чего-то, ожидающего определенного типа. Например, возвращение длины чего-либо (имеющего тип Int) тому, что должно быть типом переменной «Num a».

Но в моем случае я даже не указываю тип переменной a. Это должно быть НИЧЕГО, не так ли? Так почему я получаю эту ошибку? Если бы я понял, почему я получаю ошибку, я мог бы ее исправить, но я просто не понимаю.

Не мог бы кто-нибудь объяснить мне, почему я получаю эту ошибку?

Ваша помощь очень ценится, спасибо. - Асаф

Редактировать: Все предоставленные до сих пор ответы верны, спасибо всем вам за полезную информацию. Я собираюсь выбрать тот, который я считаю наиболее понятным (хотя мне нужно подождать 5 минут, чтобы сделать это).

5
задан Asaf 13 November 2011 в 13:22
поделиться