Интуитивно я думаю, что они оба должны возвращать пустой список.Не могли бы вы исправить меня?Почему бы и нет?
Ну - head
- это [a] -> a
.Возвращает единственный, первый элемент;нет списка.
А когда нет первого элемента, как в пустом списке?Ну что вернуть?Вы не можете создать значение типа a
из ничего, поэтому остается только undefined
- ошибка.
И tail
?Хвост, по сути, представляет собой список без первого элемента, т.е. на один элемент короче исходного.Вы не можете соблюдать эти законы, когда нет первого элемента.
Когда вы достаете одно яблоко из коробки, у вас не может быть такого же ящика (что случилось, когда tail [] == []
).Поведение должно быть undefined
тоже.
Это приводит к следующему выводу:
Я, конечно, еще не рассматривал эту тему в учебнике, но это не такисточник ошибок?Я имею в виду, что если когда-нибудь передать функции список аргументов, которые могут быть необязательными, чтение их с головой может привести к ошибке?
Да, это источник ошибок, но потому что он позволяетнаписать некорректный код.Код, который в основном пытается прочитать значение, которое не существует.Итак: * Никогда не используйте голову / хвост ** - Используйте сопоставление с образцом.
sum [] = 0
sum (x:xs) = x + sum xs
Компилятор может гарантировать , что все возможные случаи покрыты, значения всегда определены, и этонамного чище читать.