2013-02-15 5 views
0

Я смущен, почему первая и третья версии этих функций дают эту ошибку, тогда как второе определение работает нормально.Haskell: неисчерпывающие шаблоны в функции (простые функции)

-- head and tail 
third :: [a] -> a 
third [a] = head (tail (tail[a])) 

-- Pattern matching 
third2 :: [a] -> a 
third2 (_:_:x:_) = x 

-- List indexing 
third3 :: [a] -> a 
third3 [a] = [a]!!2 

Заранее спасибо

+2

ghc 7.4.1 с '-Wall' жалуется на все три функции. Какой компилятор вы используете? –

ответ

4

То есть странно, что вторая одна не жалуется, не исчерпывающие моделей, так как third2 не будет соответствовать спискам нулевой длины, один или два. Функции third и third3 жалуются, потому что [a] не является переменной, это шаблон. [a] desugars к (a:[]), так что вы могли бы написать их

third (a:[]) = head (tail (a:[])) 

third3 (a:[]) = (a:[]) !! 2 

ни один из которых будет работать, так как те единичные списки элементов. Я подозреваю, что вы хотите

third a = head (tail a) 

third3 a = a !! 2 
1

Вы должны понимать синтаксис лучше.

В принципе, есть 2 суб-Синтаксисы:

  1. синтаксис для типов
  2. синтаксис выражений и шаблонов

В синтаксисе типа, [a] означает list of elements of type a

В синтаксис выражения/шаблона, [a] означает одноэлементный список, содержащий значение a. Это эквивалентно (a:[]) (добавляется в пустой список).

Следовательно, ваша первая функция, например, проверяет, получает ли он одноэлементный список. Затем он берет голову хвоста хвоста однотонного списка, что не удастся.

Сообщение, которое вы получаете, состоит в том, что есть формы списков, которые вы не учитывали: а именно, пустой список и списки с более чем одним элементом.

И, конечно же, вы должны получать предупреждение за third2, оно охватывает только списки с 3 или более элементами. Я уверен, что вы что-то пропускаете.

+0

Вопрос заключается в том, почему вторая функция не вызывает такую ​​ошибку, а не то, что означает эта ошибка. –

+0

Я не верю, что нет. – Ingo

Смежные вопросы