Неисчерпывающие закономерности в функции max
В ghci этот код:
let max [] = error "maximum of empty list"
let max [x] = x
let max (x:xs)
| x > maxTail = x
| otherwise = maxTail
where maxTail = max xs
Вызывает ошибку: *** Exception: <interactive>:26:5-106: Non-exhaustive patterns in function max
Что такое неисчерпаемый паттерн здесь? Нулевой элемент, один элемент и многоэлементный список обслуживаются?
Обновление 2:
Обновление 3:
Работает как положено на Debian (Raspberry Pi):
2 ответа
Используя три отдельных let
s, вы определяете три отдельные, не исчерпывающие функции с именем max
каждый следит за предыдущими. Для того, чтобы определить мульти-падежную функцию, используя let
Вы используете let
ключевые слова, а затем просто повторите сигнатуру функции с одинаковым отступом для каждого шаблона следующим образом:
let max [] = error "maximum of empty list"
max [x] = x
max (x:xs)
| x > maxTail = x
| otherwise = maxTail
where maxTail = max xs
Чтобы этот (или любой другой фрагмент кода, занимающий несколько строк) работал в GHCI, вам нужно запустить многострочный режим, введя :{
а затем выйдите из него с помощью :}
или напишите все в одну строку, используя ;
вместо разрывов строк (кроме |
где ты просто пишешь |
без ;
или разрыв строки впереди).
GHCi (и вообще, let
) не позволяет вам определять функцию таким образом. Вы просто определили 3 функции, каждый раз перезаписывая друг друга.
Если вы хотите продолжать использовать GHCi, напишите что-то вроде этого:
let max list = case list of
[] -> error "maximum of empty list"
[x] -> x
(x:xs) ->
if x > maxTail then x else maxTail
where maxTail = max xs