Неисчерпывающие закономерности в функции 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 ответа

Решение

Используя три отдельных lets, вы определяете три отдельные, не исчерпывающие функции с именем 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 
Другие вопросы по тегам