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 подинтаксиса:
- синтаксис для типов
- синтаксис для выражений и шаблонов
В синтаксисе типа [a]
средства list of elements of type a
В синтаксисе выражения / шаблона [a]
означает одноэлементный список, который содержит значение a
, Это эквивалентно (a:[])
(добавлен в пустой список).
Следовательно, ваша первая функция, например, проверяет, получает ли она одноэлементный список. Затем он берет заголовок хвоста списка одноэлементного списка, который потерпит неудачу.
Сообщение, которое вы получаете, состоит в том, что есть формы списков, которые вы не покрыли: пустой список и списки с более чем 1 элементом.
И, конечно же, вы должны получить предупреждение для third2
, он охватывает только списки с 3 или более элементами. Я уверен, что вы что-то упускаете.