Ошибки общего программирования для разработчиков 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 они не просто блок выражений, но выражения.