Haskell: неисчерпывающие паттерны в функции (простые функции)

Меня смущает, почему 1-я и 3-я версии этой функции выдают эту ошибку, тогда как второе определение работает нормально.

-- 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 ответа

Решение

Странно, что второй не жалуется на неисчерпывающие паттерны, так как 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

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

В основном, есть 2 подинтаксиса:

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

В синтаксисе типа [a] средства list of elements of type a

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

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

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

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

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