Я смотрю на погружение в Haskell для моего следующего (относительно тривиального) личного проекта. Причины, по которым я занимаюсь Haskell:
- Получить мою голову на чисто функциональный язык
- Скорость. Хотя я уверен, что с этим можно поспорить, из-за того, что я видел гвозди на Haskell, близкие к C ++ (и, похоже, немного быстрее, чем Erlang).
- Скорость. Веб-сервер Warp кажется сумасшедшим быстро по сравнению практически со всем остальным .
Итак, учитывая это, я ищу недостатки или проблемы, которые возникают вместе с Haskell. В Интернете огромное количество информации о том, почему Haskell - хорошая вещь, но я не нашел много тем о его уродливой стороне (кроме жалоб на его синтаксис, который меня совершенно не интересует).
Примером того, что я ищу, может быть как GIL Python. То, что не поднимало голову, пока я действительно не начал смотреть на использование параллелизма в среде CPython.
Ответы:
Несколько минусов, о которых я могу думать:
источник
Большинство недостатков Haskell (а также большинство преимуществ Haskell) обусловлены двумя его определяющими характеристиками: он ленивый и чисто функциональный.
Быть ленивым затрудняет рассуждения о производительности. Особенно для людей, не привыкших к лени, но даже для опытных пользователей Haskeller может быть трудно понять, как лень повлияет на производительность в определенных случаях.
Лень также означает, что труднее создавать точные тесты без использования таких библиотек, как Criterion.
Быть чисто функциональным означает, что всякий раз, когда вам нужно использовать изменяемые структуры данных (в тех случаях, когда невозможно добиться желаемой производительности без них - хотя благодаря оптимизатору GHC, который происходит не так часто, как вы думаете), вы будете застрял в монаде IO (или ST), что делает код более громоздким.
Поскольку вы упомянули скорость в качестве одной из своих целей, я должен отметить, что зачастую между производительностью, оптимизированной вручную, и кодом на Haskell, написанном без особого внимания к производительности (в большей степени, чем в других языках), часто бывают огромные различия в производительности. И оптимизированный вручную код на Haskell часто бывает довольно уродливым (хотя я полагаю, что это также верно для большинства других языков).
источник
Я не эксперт по Haskell: я изучил основы, но, к сожалению, у меня не было возможности сделать какой-то серьезный проект на Haskell (хотя мне бы хотелось, потому что мне этот язык очень нравится).
Однако из того, что я знаю, и из обсуждения с кем-то, кто работал в области, достаточно близкой к функциональному программированию, Haskell может быть не лучшим решением, когда вы хотите реализовать алгоритмы графов, где вам нужно, например, пройтись по графу и выполнить много локальных изменений в структуре графа.
Поскольку граф в целом не имеет рекурсивной структуры, я считаю, что наилучшим подходом является создание одной копии графа с использованием структур и указателей между ними (как вы можете это сделать, например, в C ++) и манипулирование этой копией путем изменения указателей, создание или уничтожение узлов и так далее.
Мне интересно, как такие структуры данных и операции могут обрабатываться должным образом в Haskell, поскольку, насколько я знаю в Haskell, невозможно использовать вышеуказанное представление / подход. Некоторые проблемы с алгоритмами на графах в Haskell кратко обсуждаются в этой статье
РЕДАКТИРОВАТЬ
Недавно я говорил с экспертом по функциональному программированию, и он подтвердил, что эффективная реализация определенного алгоритма графов может быть довольно сложной в Haskell: перемещение по указателям, как вы делаете в C или C ++, может быть намного быстрее.
источник
Недостатком Haskell является то, что он другой. Это больший шаг по сравнению с языками, которые чаще всего преподаются или о которых говорят, поэтому будет большая кривая обучения. Это также менее популярный язык, который может ограничить доступ к справке, если вы застряли. Это действительно не главные недостатки, хотя.
Единственным недостатком является то, что это функциональный язык, поэтому он менее полезен для определенных проблемных областей, но это верно и для объектно-ориентированных языков. Как правило, языки не имеют истинных недостатков за пределами обучения, по крайней мере, для относительно популярных языков. Пока язык завершен по Тьюрингу, он теоретически способен на все.
источник
«Проблемы с Haskell», как правило, появляются в определенных областях. Haskell - замечательный язык для разработки приложений, гораздо приятнее писать, чем что-либо еще. Проблемы, как правило, возникают, когда вы пытаетесь сделать что-то, для чего нет хорошей поддержки, например:
источник