Голова и хвостовые звонки в пустой списке, приносящие исключение

StackOverflow https://stackoverflow.com/questions/3542969

  •  30-09-2019
  •  | 
  •  

Вопрос

Я следую за руководством. (Real World Haskell)

И у меня есть один вопрос о голове и хвосте, вызванный пустыми списками: в GHCI он возвращает исключение.

Интуитивно я думаю, что я бы сказал, что они оба должны вернуть пустой список. Не могли бы вы исправить меня? Почему бы нет ? (Насколько я помню в OZML влево или вправо от пустого списка, возвращает Nil)

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

Я просто знаю поведение GHCI, я не знаю, что происходит при компиляции.

Это было полезно?

Решение

Интуитивно я думаю, что бы сказать, что они оба должны вернуть пустой список. Не могли бы вы исправить меня? Почему бы нет ?

Хорошо - head является [a] -> a. Отказ Это возвращает один первый элемент; Нет списка.

И когда нет первого элемента, как в пустом списке? Ну, что вернуться? Вы не можете создать значение типа a От ничего, так что все, что остается undefined - ошибка.


А также tail? Хвост в основном - это список без его первого элемента - то есть один элемент короче, чем оригинальный. Вы не можете поддерживать эти законы, когда нет первого элемента.

Когда вы берете одно яблоко из коробки, вы не можете иметь того же коробки (что случилось, когда tail [] == []). Поведение должно быть undefined слишком.


Это приводит к следующему выводу:

Я, конечно, еще не охватил эту тему в руководстве, но не так не является источником ошибок? Я имею в виду, если когда-либо передаю функцию список аргументов, которые могут быть обязательными, чтение их с головой может привести к ошибке?

Да, это источник ошибок, но потому что это позволяет писать ошибочный код. Код, который в основном пытается прочитать значение, которое не существует. Итак: * никогда не используйте голову / хвост ** - используйте образец шаблона.

sum     [] = 0
sum (x:xs) = x + sum xs

Компилятор может гарантия То, что все возможные случаи покрыты, значения всегда определены, и это намного чище для чтения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top