Все статьи | Обучение

Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?

Haskell — язык, позволяющий глубже понять программирование. Как он устроен и ... главное изображение

Haskell — функциональный язык программирования, который устроен совсем иначе, чем популярные JavaScript, PHP, Python или Java — они являются императивными или смешанными языками разработки. При этом многие адепты Haskell считают, что разработчики, использующие императивные языки, должны хотя бы попробовать научиться чистой функциональной разработке ради глубокого понимания принципов самого программирования и разницы функциональной и императивной разработки. Мы попросили Haskell-разработчиков подробно рассказать о том, как устроен этот язык программирования, о своем опыте и отличиях функционального подхода от других существующих принципов программирования.

Важной особенностью Haskell является то, что он поддерживает ленивые вычисления, которые позволяют сильно ускорить работу программы и снизить нагрузку на память, а также сделать код проще и модульнее. Ленивые вычисления выполняются тогда, когда это необходимо программе, а не в том моменте, когда их указал разработчик.

В обычных — не ленивых или «энергичных» вычислениях — аргументы функции вычисляются перед выполнением самой функции. В языках программирования, которые применяют ленивые вычисления, этот процесс постоянно откладывается, и аргументы функции вычисляются только для реальной надобности, а не в том месте, где их указал разработчик. Например, если сейчас значение какой-то функций не нужно и оно не используется, то Haskell не будет высчитывать ее аргументы.

Сферы применения Haskell

Haskell сейчас используется чаще всего по нескольким основным направлениям. Достаточно часто Haskell применяют в финансовом секторе — крупные банки и другие компании, работающие на этом рынке, применяют его для разработки собственных инструментов. Бизнес применяет именно Haskell из-за гарантированности точности вычислений без ошибок.

Haskell часто используют для написания инструментов для обработки текстов, синтаксического анализа и создания фильтр-систем для обработки спама. Структура Haskell позволяет достаточно просто заложить в него правила языка, в том числе и русского, и обучить алгоритмы находить взаимосвязи с ним.

Разработчики также применяют Haskell для создания инструментов для тестирования кода на других языках программирования. Здесь используется примерно тот же алгоритм, что и в предыдущем пункте, поскольку Haskell можно легко применять не только для анализа обычных языков, но и языков программирования.

При этом Haskell можно применять и для веб-разработки, он может компилироваться в JavaScript для запуска в браузере, а на сервере запускаться в качестве быстрого машинного кода, который легко обрабатывает десятки тысяч одновременных подключений.

Эксперты — о необычности Haskell, его особенностях и перспективах

Мы попросили экспертов, которые работают с Haskell, рассказать об особенностях этого языка и о том, почему он развивает программистов.

Александр Гранин: Haskell, безусловно, помогает разработчику выйти на новый уровень

Александр Гранин

Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?

Моим первым языком был Basic, потом Pascal, а первым профессиональным языком был C++, за ним — C# и Python. Haskell я начал изучать 10 лет назад в качестве хобби, и инвестировал в него очень много времени. Профессионально я пишу на Haskell более трех лет. Ещё я пишу на PureScript — это язык, очень похожий на Haskell, но компилирующийся в JavaScript. И я даже написал фундаментальную книгу о том, как создавать реальные приложения на Haskell — Functional Design and Architecture.

Любопытно, что изучать Haskell как первый язык можно, и это будет даже легче, чем изучать его после 5-10 лет опыта в C++, Java, PHP, C#, Python, JavaScript и других мейнстримных языках. Это связано с тем, что мейнстримные языки исповедуют, в основном, императивную и объектно-ориентированную парадигмы. Долгое их использование ведет к образованию ментальных рельс, и опытному разработчику становится трудно с них соскочить и понять функциональную парадигму.

Обратный эффект, вероятно, тоже есть: когда сначала изучаешь ФП, долго на нем пишешь, а потом традиционное ООП кажется очень неудобным и сложным. Но обратный эффект зафиксировать сложнее, так как не очень много людей начинали с Haskell или другого функционального языка.

Есть смысл в том, чтобы изучать Haskell в качестве первого языка. Это будет чуть-чуть сложнее, чем Python или Pascal, но не намного. На начальном уровне Haskell — довольно простой язык. Проблемы с его изучением возникают из-за его необычности, так как его синтаксис и набор базовых концепций стоит сильно в стороне от привычных Си-подобных языков. Haskell могут понять все. Однако его более продвинутое использование, конечно, требует значительной подготовки. Но я все-таки считаю, что нет ни одного языка, сложнее С++, — на всех уровнях (базовый/средний/продвинутый). А С++ повсеместно учат и повсеместно используют.

В качестве первого языка я бы все же посоветовал Python, но ни в коем случае на нем не останавливаться. Pascal — тоже вариант, Golang и даже Rust! На самом деле, с какого бы языка вы ни начинали, вы должны понимать, что на этом этапе важнее всего умение понять задачу, декомпозировать её на простые подзадачи, вплоть до мельчайших частей, составить алгоритм, его запрограммировать и отладить.

С первым языком программирования вы должны изучать программирование как таковое, потому что навык составлять инструкции для компьютера — основополагающий. Без него дальнейшее продвижение в разработке невозможно. А какой там будет язык — это уже дело десятое, можно выбирать что-то себе по душе. И конечно же, через какое-то время нужно учить другие языки программирования. Лучше всего — из разных парадигм, тогда у вас будет наиболее полное представление о разработке, и как таковые языки перестанут быть загадочными. Вы сможете взять любой и разобраться в нем за считанные часы. Так что имеет смысл учить по одному или нескольким языкам из следующих категорий:

  • системные языки (Си, Rust, Assembler)
  • низкоуровневые статически типизированные языки с ручным управлением памятью (С++, Rust)
  • высокоуровневые языки с управляемой (managed) памятью и статической типизацией (C#, Java, Scala, Kotlin, Haskell, Go)
  • динамические языки (Python, JavaScript, PHP, Clojure, Ruby, Erlang)
  • императивные языки (Си, С++, Rust, Go)
  • объектно-ориентированные языки (Java, C#, Ruby, C++, JavaScript, PHP)
  • функциональные языки (Haskell, Scala, Clojure, Erlang)
  • логические языки (Prolog)

Учить, конечно, не за один присест, но постоянно, методично и планомерно.

Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?

Haskell, безусловно, помогает разработчику выйти на новый уровень. И дело не только в функциональной парадигме. И даже не в том, какие новые языковые конструкции предлагает Haskell (например, алгебраические типы данных и паттерн-матчинг — то, чего так не хватает в других языках). Дело в том, как программист начинает структурировать код. Если программист пишет код-лапшу, не отделяет чистые функции от нечистых, не стремится к тестируемости кода, и в принципе пишет «грязный» (по Роберту Мартину) код, то функциональное программирование ему будет даваться тяжело. Такой код не композируется, плохо управляется, и, в целом, противопоказан в функциональных языках.

На самом деле, практики чистого кода важны во всех языках, во всех парадигмах, и must-follow всеми профессиональными разработчиками. Но функциональные языки, в частности Haskell, предъявляют больше требований. Так например, в Haskell деление на чистые и нечистые функции вшито в сам язык. Там всё еще можно «хачить» код и не задумываться, но функциональная природа Haskell будет этому сопротивляться. Кстати — это частая причина того, что Haskell не заходит разработчикам. Код в стиле «поток сознания» будет работать очень плохо, если его вообще удастся написать. А традиционные языки никак такому стилю не препятствуют.

Программисты на JavaScript могут гордиться: их язык, а также Scala, затащили функциональное программирование в мейнстрим. JS — весьма функциональный язык, хотя конечно, там присутствуют и другие парадигмы. Но изучать Haskell полезно вообще всем профессиональным разработчикам. Тому есть несколько причин.

  • Haskell — это «идиоматичное функциональное программирование». Это эталон функционального программирования со статическими типами. И он же — источник огромного количества идей и приемов, которые перенимают другие языки. Так, многие фреймворки в JS имеют функциональные черты, а еще есть популярные библиотеки (ramda) для ФП. C++ как язык в последние годы развивается в сторону функционального программирования. В нем, например, появилась библиотека ranges, предлагающая чисто функциональные инструменты обработки коллекций. И, на самом деле, аналогичные вещи уже были в C# (Linq) и Java (streams). Всё это порождения функциональной парадигмы, напрямую заимствующие из Haskell подходы и идеи. Я это утверждаю вполне серьезно, потому что общался с авторами этих подходов, и они не скрывают источника вдохновения — Haskell. Для всех мейнстримных языков есть даже доклады, показывающие, как концепции из Haskell заимствуются и перетекают в другие экосистемы. Я и сам сделал 7 (семь) докладов о функциональном С++. И можно сделать еще столько же, — так много всего функционального происходит в modern C++. Поэтому изучение Haskell дает очень много подсказок о том, как писать на других языках.

  • Haskell дает разработчику очень много новых инструментов: иммутабельность, чистые функции, монады, алгебраические типы данных, pattern-matching, стройная система типов, отличный вывод типов, функционально-декларативный стиль кода. Это всё то, чего очень не хватает в мейнстримных языках. Сейчас многие концепции туда перетекают, так как они доказали свою полезность. Если разработчик претендует на роль старшего, лида или архитектора, его инструментарий должен быть как можно шире. И современный мир накладывает такое требование: нужно знать и ООП, и ФП. А ФП лучше всего изучить в его самом правильном проявлении — Haskell.

  • Haskell очень расширяет сознание. Писать на нем — очень приятно. Ни один другой язык не может предоставить такой уровень уверенности в коде. Разработчик чувствует, что написанный и скомпилированный код на Haskell будет надежен, и даже со временем не потеряет этой надежности. Такого уровня гарантий ни один другой язык предоставить не может. Например, код на С++ легко может взорваться на каждом шагу, и часто — непонятно почему. Undefined behavior поджидает за каждым углом, ничему нельзя доверять, ни на какую часть кода нельзя полагаться. Это очень неприятно, и крайне осложняет разработку. Изучать Haskell нужно уже хотя бы потому, что он показывает, какое приятное может быть программирование.

Какие есть особенности у Haskell? Какие очевидные плюсы и минусы есть у этого языка?

Главная особенность языка заключается в том, что Haskell предлагает совершенно иной взгляд на то, как писать программы. Сейчас уже неоспоримо, что функциональное программирование — это следующая большая парадигма после объектно-ориентированного, и что тренд будет только усиливаться. А значит, есть возможность запрыгнуть на этот поезд и оказаться в числе первых. Функциональное программирование — это не просто модное направление, это способ решать те же задачи более удобным, лаконичным и понятным способом. А еще решать новые задачи, которые было сложно решить на традиционных языках.

Очевидные плюсы Haskell как такового — это разделение на чистый и нечистый слои на уровне языка (монада IO), иммутабельность, полезные монады (Maybe, Either, List), алгебраические типы данных, богатый набор примитивов для конкурентного программирования (Software Transactional Memory, MVar). При этом с использованием продвинутой системы типов можно следовать подходу “make invalid state irrepresentable” (то есть, невалидные состояния программы запрограммировать просто нельзя). Haskell — это очень консистентный язык, из-за этого у вас появляется понимание, что в других языках сделано правильно, а что не очень, повышается осознанность их использования.

Концепции из Haskell тоже очень полезны, а если вы пишете многопоточный код, то Haskell предлагает целый клондайк подходов и идей, помогающих бороться со сложностью и повышать надежность программ. Еще одна хорошая сторона — большое количество учебных материалов по Haskell: написаны разные книги, статьи, туториалы, есть видеокурсы и упражнения. И всегда есть у кого попросить помощи. В Haskell есть свои системы сборки и свои пакетные менеджеры (stack и cabal), и они работают замечательно, да и компилятор GHC генерирует оптимизированный, сравнительно быстрый код (не хуже Java c JVM).

Минусы у Haskell, конечно, есть. Сложность верхнеуровневых type-level концепций, неудовлетворительная работа с рекордами, подводные камни его ленивой природы. Есть проблемы и с экосистемой, и они, пожалуй, более существенны. Развитие единственного компилятора — GHC — происходит неравномерно, иногда с потерей обратной совместимости. Документация на библиотеки часто плохая, и сами библиотеки оставляют желать лучшего. Для большинства типичных задач библиотеки есть, но решение нестандартных задач будет затруднено. Практики и подходы разработки больших приложений только установились, но еще предстоит пройти большой путь.

Кроссфплатформенность — еще одна проблема. Haskell замечательно работает под Linux и MacOS, а с Windows есть некоторые проблемы. К сожалению, направление Windows не в приоритете у разработчиков GHC. Наконец, — и для кого-то это очень важно, — для Haskell нет хороших IDE. Предпринимались разные попытки их создать, но пока что можно рассчитывать только на элементарную подсветку синтаксиса и наивное автодополнение по словарю. Более продвинутые фичи (навигация и рефакторинг) в разных плагинах либо забагованные, либо не справляются с разумно большими проектами.

В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?

К сожалению, этот миф очень мешает. Haskell видят как академический язык, а между тем он очень практичен, и он готов к production. Хаскеллисты тоже не все академики, и даже не все знают глубокую математику. Это и правда миф. Не нужно знать ни Теорию Категорий, ни Лямбда-Исчисление, ни другую продвинутую математику, чтобы писать на Haskell полезные программы. В сообществе есть люди, которые занимаются очень умными вещами на границе Computer Science, и им математика нужна. Но также есть и другие люди, которые успешно разрабатывают коммерческие продукты на Haskell без потребности в глубоких математических концепциях.

Например, я изучаю Haskell десять лет, и пишу на нем профессионально более трех, но не математик, и ничего кроме остаточных знаний от университетской программы у меня в голове нет. Тем не менее, я вполне успешен. Даже более успешен, чем с языками C++, C# и Python.

Как индустриальный инструмент, Haskell хорошо зарекомендовал себя во многих областях: распределенные, многопоточные и конкурентные приложения, финансовые приложения, компиляторы, инструменты обработки данных, веб-бэкенды и десктопные приложения. Об этом можно почитать статью Гонзалеса “State of the Haskell ecosystem”.

А вот фреймворки — это интересная тема. Долгое время в сообществе отрицалась необходимость фреймворков. Это было время, когда практики и подходы промышленной разработки на Haskell даже не начали оформляться. Но в последние годы всё изменилось, и я тоже приложил к этому значительные усилия. Сейчас в Haskell есть ряд фреймворков и архитектурных библиотек, которые набирают популярность. Возможно, я автор наибольшего числа фреймворков во всем мировом Haskell-сообществе, потому что я их сделал более четырех.

  • Hydra — полноценный фреймворк для создания web-бэкендов, многопоточных и конкурентных приложений. Позволяет работать с SQL DB, с KV DB, поддерживает логгирование, процессы, подсистему для взаимодействия с консолью. Hydra — это даже не один, а целых три фреймворка, основанных на разных движках, чтобы было можно сравнивать между собой разные подходы и дизайн. Hydra — преимущественно демонстрационный проект, который я использую для своей книги, но эти же идеи легли в основу коммерческих фреймворков, которые я создал для разных компаний.
  • Node — фреймворк для создания распределенных приложений. В его основе лежит та же самая методология, на которой базируются все мои фреймворки.
  • PureScript Presto — фреймворк для написания мобильных приложений. Это другой язык, PureScript, но он очень похож на Haskell, и является его идейным продолжателем. PureScript компилируется в JavaScript, и его главная платформа — это web.
  • PureScript Presto.Backend — фреймворк для web-бэкендов, который унаследовал дизайн у PureScript Presto. Оба фреймворка активно используются в индийской финансовой компании Juspay и являются ее ключевыми технологиями. На них построено очень популярное мобильное приложение для денежных переводов, а также платежный сервис и бэкенд.

Эти фреймворки доступны в Open Source, но есть еще два коммерческих фреймворка, оба в компании Juspay, которые я для них создал, но они ещё не опубликованы.

Что касается других фреймворков, то у нас есть:

  • Yesod — web framework;
  • Snap — web framework & HTTP server;
  • Servant — HTTP server;
  • IHP: Integrated Haskell Platform — фреймворк для сервер-сайд рендеринга;
  • ...и другие, частичный список которых можно найти здесь.

Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?

Вакансий на Haskell сейчас не очень много. Доля рынка у этого языка очень маленькая. И хотя она растет, и появляются новые компании, делающие на него ставку, все равно их на два-три порядка меньше, чем у самых популярных языков. Тем не менее, становится проще отслеживать вакансии, проще взаимодействовать с работодателями. У нас есть ряд ресурсов, где постятся предложения: Reddit, чат в Телеграме, тематические чаты. Эти вакансии не постятся на HeadHunter и подобных сервисах, потому что более выгодно прийти в сообщество и обратиться к нему напрямую. Но надо сказать, что есть некоторое превышение спроса над предложением. Хаскеллистов требуется больше, чем их есть, особенно таких, которые умеют решать задачи бизнеса. Возможно, для старта карьеры Haskell подходит не очень, но если вы обрели почву под ногами в других экосистемах, то Haskell может стать очень приятным продолжением.

Будет ли Haskell востребован в будущем?

Есть опасения, что Haskell может перестать привлекать даже то внимание, которое привлекает сейчас. Риск связан с тем, что традиционные языки надежно удерживают лидерские позиции, и приходят новые языки, перенимающие из Haskell все самое лучшее. Такой, например, Rust. Стартовав совсем недавно, он обгонит Haskell по популярности, и есть очень большой смысл инвестировать в Rust, пока это еще не стало мейнстримом.

В то же время, ближайшие пять лет Haskell всё еще будет присутствовать на рынке, потому что есть ряд компаний, где он зарекомендовал себя очень хорошо. Не могу сказать, что его будущее безоблачно, но выражаю осторожный оптимизм. Потому что я сам прикладываю большое количество усилий, чтобы популярность Haskell в индустрии росла, чтобы он всегда оставался с нами и продолжал приносить пользу и радость.

Владислав Завьялов: Haskell позволяет понять программирование глубже, ведь именно через него можно освоить концепции функционального программирования

Владислав Завьялов

Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?

Первым языком я изучал BASIC. Потом были Pascal, C++, C#, Python. Опыт с этими языками у меня был поверхностный, но достаточный, чтобы начать задаваться вопросом: неужели нельзя сделать язык получше? Мне хотелось помощи от компилятора в написании корректного кода. Статическая проверка типов, автоматическое управление памятью, неизменяемые данные. В итоге мне посоветовали попробовать Haskell. С первых строк книги о нем я понял, что нашел язык для себя: чистые функции, ленивые вычисления, статическая типизация.

Если бы я начал с Haskell как первого языка, то не смог бы оценить его по достоинству. Только после опыта борьбы с сегфолтами, рантайм-ошибками, и неконсистентным изменяемым состоянием, функциональное программирование представилось глотком свежего воздуха. Когда я стал искать первую оплачиваемую работу, то наверняка знал только одно: это должна быть разработка на Haskell. Так что весь мой опыт коммерческой разработки именно на Haskell.

У каждого человека, так или иначе, будет свой путь в программировании, и Haskell — это такая же неплохая отправная точка, как любая другая. Так что если кто-то хочет изучать Haskell как первый язык, я это только поддерживаю.

Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?

Безусловно, Haskell позволяет понять программирование глубже, ведь именно через него можно освоить концепции функционального программирования. Но это действует и в обратную сторону: программисту на Haskell полезно изучить JavaScript и написать на нем что-то нетривиальное.

В целом, полезно осваивать языки, максимально непохожие друг на друга, представляющие разные парадигмы. Только увидев и ощутив совершенно разные подходы к решению задач можно осознать, где фундаментальная сложность задачи, а где недостатки того или иного инструмента.

Я написал про это статью: десять причин использовать Haskell. В ней я называю следующие особенности Haskell:

  • Безопасное управление памятью, сборка мусора
  • Компиляция в нативный код
  • Статическая типизация, развитая система типов
  • Чистые функции
  • Ленивые вычисления
  • Многопоточное программирование
  • Метапрограммирование (генерация кода)

Некоторые из этих особенностей — например, сборка мусора, есть и у более популярных языков. Некоторые из них, такие как ленивые вычисления, больше практически нигде не встречаются. Но именно их совокупность делает Haskell хорошим языком для разработки библиотек и приложений.

Из минусов: есть случаи, когда Haskell не подходит. Например, для фронтэнда веб-приложений лучше выбрать язык, который дает на выход компактный и быстрый JavaScript. При этом для вычислений в реальном времени, паузы на сборку мусора могут быть неприемлемы. Но в большинстве случаев Haskell подходит хорошо.

В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?

Конечно, можно на Haskell реализовать решатель системы линейных уравнений и неравенств. Думаю, все согласятся — это математика. Но это же делается для какой-то цели, а не просто так. Например, в Cassowary (https://overconstrained.io) такие системы неравенств предлагается решать в графических интерфейсах пользователя, чтобы расположить элементы интерфейса на плоскости экрана. И там есть много реализаций на разных языках, на том же JavaScript их больше пяти, а на Haskell только одна. То есть выходит, что это JavaScript язык для математики? Или что Haskell это язык для графических интерфейсов пользователя?

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

Haskell может применяться для всех тех же задач, что и другие языки, такие как Python, C#, Java, в том числе для написания бэкндов веб-приложений, прикладных программ с графическим интерфейсом или интерфейсом командной строки, системных утилит, компиляторов, систем анализа и обработки данных, и чего угодно еще. Из фреймворков, хочу отметить Servant. Это отличный способ написать веб-сервис на Haskell.

Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?

Периодически я вижу, как ищут Haskell-разработчиков. Но конкуренция за эти места достаточно сильная: Haskell приходится по нраву многим разработчикам, и на вакансии быстро находятся желающие. Поэтому надо готовиться к тому, что ожидания у работодателя будут высокими.

Будет ли Haskell востребован в будущем?

Посмотрим! Язык продолжает развиваться, с каждой версией компилятора добавляется что-то новое и интересное. Мне видится, что Haskell набирает обороты.

Алексей Пирогов: На Haskell пишут значительно более разнообразное ПО, чем на том же PHP

Алексей Пирогов

Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?

Я изучал Haskell, уже будучи профессиональным программистом. При этом смысл изучать Haskell в качестве первого языка действительно есть — можно научиться ФП до того, как голова окажется забита всякой «процедурщиной».

Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?

Haskell позволит по-настоящему пощупать функциональное программирование в естественной для него среде, а не в качестве пристройки к процедурному языку. При этом элементы функционального программирования есть и в PHP или JavaScript, но погружение в функциональную среду позволит применять эти элементы правильно и к месту.

Статический анализ кода и проверка типов сегодня используются в том числе и применительно к изначально динамически типизированным языкам — даже к языкам со слабой динамической типизацией, таким как JavaScript или PHP. Haskell же не только статически типизирован, статическая типизация в Haskell — сильная. А это сам по себе сильный «сдвиг парадигмы». Но и кроме смены вида типизации, меняется сам подход к проектированию: вы пишете код от типов — Type-Driven Development. Более того, часто компилятор пишет код за вас — опираясь на описанные вами типы. Это не только интересно, но и практично.

В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?

На Haskell пишут значительно более разнообразное ПО, чем на том же PHP. Тут вам и высокоскоростной трейдинг (HFT) и сворачивание белков, и синтез электронных схем, вычисления на GPU. Например, в Facebook на Haskell написана подсистема фильтрации спама: на специальном мини-языке (DSL) пишутся правила фильтрации, а потом весь набор правил компилируется в высокоэффективный машинный код — это ещё одно отличие от интерпретируемых JS и PHP.

Haskell — язык общего назначения, подходит он для многого. Можно и Web писать: Haskell компилируется в JavaScript для запуска в браузере, а на сервере запускается быстрый машинный код, легко обрабатывающий десятки тысяч одновременных подключений. Имеются даже фреймворки для некоторых областей: для Web это Servant, Scotty, в других же не принято использовать фреймворки вообще: в ФП принято композировать функции, и фреймворк не нужен, когда функций достаточно и они хорошо композируются.

Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?

Работа есть. Если хочется full-time писать на Haskell, то вы всегда найдёте, где это можно делать. Да, язык — не мейнстримовый, но сказать, что на нём никто не пишет, нельзя. Про сочетания с инструментами сказать сложно: опять же всему виной разнообразие задач, которые решаются на Haskell. В Web используют СУБД, такие как PostgreSQL, frontend-серверы — по типу Nginx.

Будет ли Haskell востребован в будущем?

Интерес к ФП в целом — растёт, и сам по себе Haskell активно развивается. OpenSource библиотеки покрывают все большее количество областей. И работы тоже становится больше, в том числе и в наукоёмких областях — ML, компьютерное зрение, квантовые вычисления, биоинформатика. Так что, да, я считаю, язык Haskell будет востребован в будущем.

Дмитрий Коваников: Изучить Haskell будет полезно каждому разработчику, даже если они не планируют связывать свою карьеру с этим языком

Дмитрий Коваников

Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?

До знакомства с Haskell я несколько лет уже программировал на Java, Kotlin и C++, поэтому Haskell не был моим первым языком программирования, но он был первым функциональным языком, который я использовал. По своему опыту преподавания Haskell я могу сказать, что он вполне подходит и в качестве первого языка. Сам Haskell вполне самодостаточен и не содержит в себе принципы, требующие изучения других языков заранее.

Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?

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

С точки зрения профессионального роста, Haskell помогает лучше понять и применить следующие подходы:

  • Декомпозиция бизнес логики на более маленькие и независимые части, которые затем можно легко объединять и комбинировать.
  • Выражение состояний программы и различной логики через типы данных.
  • Использование алгебраических абстракций для описания высокоуровневого интерфейса.
  • Многопоточное программирование через более удобные примитивы.

Например, разделение бизнес логики на чистые функции по валидации данных и функции с сайд-эффектами по работе с БД полезно и в PHP, и в Java, но именно в Haskell компилятор заставляет писать в таком стиле. Можно считать, что компилятор Haskell, как внимательный ментор, не даст написать код, в котором легко ошибиться. И именно поэтому он заставляет прокачаться — чтобы написать работающий код, необходимо выполнить все правила компилятора и структурировать код в естественном для языка стиле.

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

Из положительных сторон Haskell:

  • Самый большой плюс — создание легко-поддерживаемого кода. Компилятор является очень большим помощником! Гниение кода очень легко избежать, и даже если не трогать проект 2 года, можно вернуться к нему, и он по-прежнему будет работать. Более того, его легко можно будет обновить.
  • Очень легко рефакторить код, и, более того, есть уверенность в том, что рефакторинг не сломает бизнес-логику. Любое легаси можно перевести на современные подходы без необходимости переписывать проект заново.
  • Изначально получается написать более корректный код в среднем, так как язык по дизайну помогает избежать большого класса ошибок в программах.
  • Haskell постоянно развивается и пополняется фичами, недоступными в других языках, так как обычно ресёрч в области PL происходит на Haskell. Исследователи находят очень привлекательным тот факт, что языком пользуется много людей для решения практических проблем, поэтому стараются придумывать более полезные фичи, которые позволят решать задачи более эффективно.
  • Удобные примитивы для написания многопоточного кода: Software Transactional Memory, библиотека async, и т. п.
  • Эффективная рантайм система: легковесные потоки, два вида сборщика мусора для различных юзкейсов, множество способов профилировать и анализировать рантайм статистику, и т. п.
  • Не у всех проблем есть установленные решения, поэтому люди всегда экспериментируют с новыми подходами и пытаются искать более удобные и эффективные способы решения существующих проблем.
  • Меньше церемоний: бизнес-логика более явно видна в приложении, а не прячется за слоями деталей реализации, очень много инструментов избавления от бойлерплейта, сам язык довольно лаконичный и элегантный, идеи из головы более прямо и быстро транслируются в рабочий код.

Но и минусы есть, а именно:

  • Haskell — один из немногих языков, которым одновременно активно пользуются и люди для теоретических исследований в области PL, и промышленные программисты. Поэтому, например, не всегда можно найти библиотеку с API какого-нибудь сервиса. Или, если у автора библиотеки более академическая наклонность, то документация будет использовать более научные термины. В то время как мейнстримовые языки создавались целенаправленно для решения проблем из продакшна, Haskell пользовался большей популярность у академиков. Это преимущество с одной стороны, так как в основах стандартных библиотек и фреймворков лежат более фундаментальные абстракции. Но с другой стороны, у некоторых практических проблем только непрямые пути эффективного их решения.
  • Время компиляции проектов бывает очень долгим, особенно когда используешь продвинутые фичи языка.
  • Сообщество языка немного раздроблено: соревнующиеся билд-тулы, веб-фреймворки, и т. п. Иногда это затормаживает развитие и улучшение библиотек, так как для интеграции со всеми инструментами приходится использовать только фичи, которые поддерживают все.

В целом, я считаю, что сейчас плюсы перевешивают минусы, и многие минусы решатся со временем. Они не являются какими-то фундаментальными ограничениями языка, просто требуется больше времени и людей, чтобы всё улучшить.

В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?

Я абсолютно не согласен с утверждением, что Haskell — язык для математики. Я на Haskell пишу бэкенд веб-сервисов, CLI тулы, библиотеки декондинга, логирования, БД.

В бэкенде типичного веб-приложения можно встретить следующие библиотеки:

  • servant — веб-фреймворк для описания REST API
  • postgresql-simple — библиотека для общения с PostgreL
  • co-log — библиотека логирования
  • aeson — парсинг JSON объектов
  • bcrypt — хеширование паролей
  • ekg — мониторинг запущенного сервера
  • blaze-html — eDSL для генерации HTML
  • hspec и hedgehog — фреймворки для юнит- и проперти-тестирования
  • proto-lens — генерация Haskell типов данных из protobuf сообщений
  • и очень много других библиотек для решения типичных проблем

Так как в Haskell есть сборщик мусора, то язык не подходит для написания проектов, где требуется больший контроль над управлением памяти. В таких областях лучше выбрать Rust, C++, C. Но везде, где можно использовать Java, PHP, Ruby, Scala, Go, можно так же использовать и Haskell: бекенд веб-приложений, сервисы, CLI тулы, IDE, компиляторы, анализаторы кода — тут Haskell особенно хорошо подходит.

Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?

На программистов со знанием Haskell есть спрос. В еженедельной рассылке Haskell Weekly каждый раз бывают вакансии от компаний, которые ищут Haskell-разработчиков. Особенно популярен Haskell у стартапов, так как им не нужно интегрироваться с существующими системами и есть возможность использовать продуктивные инструменты.

Обычно компании, которые используют Haskell, склоняются в сторону функциональных языков (и инструментов в общем), поэтому помимо знания Haskell в требования можно встретить SQL, Elm/PureScript, Nix, Rust.

Будет ли Haskell востребован в будущем?

Однозначно будет. Язык продолжает развиваться и улучшаться, каждые полгода выходит новая версия компилятора с новыми фичами, улучшениями перформанса и багфиксами. Всё больше и больше компаний используют Haskell, а ресёрч в области PL не прекращает развиваться.

Денис Москвин: Будущее, в котором Haskell востребован, выглядит гораздо более упорядоченным и разумным

Денис Москвин

Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?

Когда я изучал свои первые языки, Haskell еще не было. Это 80-е годы прошлого века, тогда в СССР были более-менее широко доступны Fortran, Basic, Pascal и C. Функциональными языками если кто-то и занимался, то очень локально, я про них ничего тогда не слышал. Впрочем, я по образованию физик, поэтому нам языки программирования преподавали главным образом в контексте научных расчетов.

Haskell в качестве первого языка можно было бы попробовать преподавать, но, если речь о детях 11-13 лет, то нужно очень аккуратно продумать методику. В целом я даже не очень понимаю, как оценить успешность подобного эксперимента. Очевидно, что если это будет делать энтузиаст Haskell с хорошими педагогическими скиллами, то результат будет довольно приличный. Но насколько это масштабируется в более-менее массовое образование — непонятно.

Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?

Haskell — чисто функциональный типизированный язык с нестрогой (ленивой) моделью исполнения. Функциональное программирование в целом, и Haskell, как один из наиболее чистых представителей этой парадигмы, позволяет программисту освоить новый, нетрадиционный подход к написанию программ. В императивных языках программа — это последовательность инструкций, в функциональных программа — это выражение. Это довольно сильное отличие, не только в синтаксисе, но и в модели исполнения. Например, все структуры данных иммутабельны, то есть не изменяются после создания. Благодаря этому свойству, мы получаем большой набор гарантий относительно поведения программ. Более того, эти гарантии известны не только нам, но и компилятору, что позволяет ему выполнять довольно высокоуровневые оптимизации.

Выражениям, в отличие от инструкций, легче приписывать типы. Поэтому в Haskell очень богатая и стройная система типов, при этом программисту почти не требуется указывать типы вручную — подсистема вывода типов делает это за него.

Ленивая модель вычислений позволят не вычислять те подвыражения большого выражения, которые не нужны для получения конечного результата, Это дает, например, возможность описывать потенциально бесконечные структуры данных, например, список всех нечетных натуральных чисел [1,3..]. И работать с ними так же как с обычными конечными структурами.

При этом все стандартные практики и идеи из функциональных языков можно напрямую использовать в традиционных императивных. Тем не менее, представление о таких практиках и понимание того, как все это работает, безусловно делает программиста более компетентным. Haskell, как чисто функциональный язык, позволяет познакомиться с подобными практиками в «дистилированном» виде, в отличие от «смешанных» языков, вроде Scala или Closure.

В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?

Профессиональные математики не особо используют языки программирования в своей повседневной работе. Они, главным образом, теоремы формулируют, доказывают и статьи про это пишут. Сам Haskell и его модель вычислений действительно базируются на хорошо проработанной математической теории. Но это плюс, а не минус: в стандарте языка почти нет темных углов и плохо совместимых свойств.

Что касается использования Haskell, то это язык общего назначения, на нем можно писать практически любой код. Большинство популярных прикладных библиотек портированы на Haskell и доступны на Hackage — центральном репозитории пакетов. Основные инструменты работы — компилятор Glasgow Haskell Compiler (GHC) и поставляемый с ним интерпретатор GHCi, Cabal — инструмент создания пакетов и их дистрибуции, инструменты для поиска в документации (Hoogle и Hayoo) и для её генерации (Haddoc).

Обычно на Haskell реализуют проекты с нетривиальными схемами обработки данных. Это связано с тем, что для стандартных схем существует огромное количество популярных и развитых фреймворков, привязанных к экосистемам конкретных языков. В коммерческой разработке Haskell довольно активно используют в финансовом анализе, в инженерном обеспечении технологий на базе блокчейна, есть несколько успешных команд, использующих его в прикладной биоинформатике.

Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?

Некоторый спрос есть, но он довольно нишевый.

Будет ли Haskell востребован в будущем?

Будущее, в котором Haskell востребован, выглядит гораздо более упорядоченным и разумным. Поэтому будем на это надеяться.


На Хекслете сейчас нет курсов изучения Haskell, однако есть отдельный курс по функциональному программированию для JavaScript, вебинар на эту тему от разработчика Никиты Соболева или программиста Александра Гранина, бесплатный курс по языку Racket и небольшой курс по функциональному языку программирования Erlang. Кроме того, на нашем сервисе Codebattle есть возможность выбрать Haskell и решать задачи на этом языке.

Аватар пользователя Святослав Иванов
Святослав Иванов 07 августа 2020

Бесплатные курсы на Хекслете

Учитесь в удобном для вас ритме