Ошибки общего программирования для разработчиков Haskell?
В духе других распространенных ошибок в вопросах, каковы наиболее распространенные ошибки, которые делают программисты Haskell? Я преподавал себе Haskell на некоторое время, и я начинаю чувствовать себя достаточно комфортно с языком, чтобы начать применять его в реальном мире.
Ответы
Ответ 1
Самая распространенная ошибка, о которой я знаю, представляет собой утечку пространства через ленивую оценку. Существует много способов добиться этой ошибки, но особенно важно, чтобы программисты с другим опытом функционального программирования ставили результат в накопительный параметр, считая, что накопительный параметр будет занимать постоянное пространство. Во многих случаях накопительный параметр принимает линейное пространство, поскольку параметры не оцениваются.
Другая распространенная ошибка - забыть, что let
всегда рекурсивна. Непреднамеренное
let x = ... x ...
может привести к ошибочным результатам.
Большинство других распространенных плохих событий проявляются не как ошибки, а как проблемы с получением программ мимо проверки типов или с трудностями в понимании модели моноидального ввода-вывода. Иногда возникают трудности со списком и с обозначениями do
.
В целом трудности, с которыми сталкиваются начинающие программисты Haskell, включают
- Большой язык со многими темными углами, особенно в системе типов.
- Не удается получить программы для компиляции, особенно когда они делают I/O
- Выполнение всего в монаде
IO
- Большая трудность, предсказывающая поведение времени и пространства ленивых функциональных программ
Ответ 2
Общей ошибкой для начинающих программистов Haskell является забыть разницу между пространствами имен конструктора и типа. Это была такая новизнова ошибка, что я смущен тем, что мое имя привязано к ней, но я уверен, что другие наткнутся на этот ответ, когда у них возникнет аналогичная проблема, поэтому она также может оставить ее там.
Ответ 3
Разница между []
и [[]]
: пустой список и список с 1 элементом, а именно пустой список. Это особенно всплывает в базовых случаях рекурсивных функций.
Ответ 4
Используйте не-хвостовые рекурсивные функции или не строгие складки, возникающие при переполнении стека.
Ответ 5
Понятие выражения довольно запутанно для новичков. Возьмите условную конструкцию на языках императивного программирования. Там его просто конструкция, но в Haskell - это выражение. Таким образом, условие if должно иметь совпадающее другое, и оба должны давать значения одного и того же типа оценки.
wrongFunc n = if n > 18
then 1
else False
Блок if вычисляет целое число, когда else возвращает bool. Это обычная ошибка, так как в Haskell они не просто блок выражений, но выражения.