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 без потребности в глубоких математических концепциях.
Читайте также:
DevOps — что это такое и почему эти практики меняют мир разработки уже сейчас
Например, я изучаю 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 выражаются естественным образом. Когда пытаешься решать реальные задачи в таком стиле, и когда язык заставляет тебя постоянно думать и писать в таком стиле, то начинаешь и на других языках видеть способы применения этих техник для написания более корректного и поддерживаемого кода.
Читайте также:
Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты восхищаются им
С точки зрения профессионального роста, 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 и решать задачи на этом языке.
Никогда не останавливайтесь:
В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях
<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 20:37:04 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="CkVVvYVWvp_cX7WmMiHjLxpl_LeTRqt42dygis7UsKnllJ6KdygT_2ockT4-LhNY2mzRHZtxVdpkPDrenNNXxw";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики? (Код) | Блог Хекслета</title>
<meta name="description" content="Информационный материал в блоге Хекслета: Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики? (категория: Код). Опытные наставники, практика на тренажерах, open-source проекты в портфолио. Индивидуальное и групповое онлайн-обучение в школе">
<link rel="canonical" href="https://ru.hexlet.io/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki">
<meta property="og:title" content="Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики? (Код) | Блог Хекслета">
<meta property="og:description" content="Информационный материал в блоге Хекслета: Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики? (категория: Код). Опытные наставники, практика на тренажерах, open-source проекты в портфолио. Индивидуальное и групповое онлайн-обучение в школе Хекслет.">
<meta property="og:image" content="https://ru.hexlet.io/vite/assets/blog_post-7eTyeLLt.webp">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="01q47tUqy4kV4Ft7-1vHOMew_MIr7e0GKxtILeIp7Yg8i3PZJ1Rm6aOjf-P3VDdPB7nRaCPaE6SW-9J5sC4K5g" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="/vite/assets/blog_post-7eTyeLLt.webp"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MywicHVyIjoiYmxvYl9pZCJ9fQ==--61c43d4881ca8feecc6f37dfafdc4e304f34b52f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1NywicHVyIjoiYmxvYl9pZCJ9fQ==--bd2826bc88b4074fdf555368020c1fc0ac0705c1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1OCwicHVyIjoiYmxvYl9pZCJ9fQ==--023ea18f500b1c4c91617fa96bbc52df8395da39/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/blog/posts/show","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T20:37:04.558Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"CUfnp3pd388IgdPJTC_88Ntj1Fedo90aktBwovprjDjmliyQiCNyr77C91FAIAyHG2r5_ZWUI7gvMOr2qGxrVg","post":{"model_name":"BlogPost","category":{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},"creator":{"public_name":"Svet Ivanov","id":288263,"is_tutor":false},"tags":[{"id":1119,"slug":"bez-steka","name":"Без стека"}],"id":944,"title":"Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?","slug":"haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki","state":"published","summary":"Haskell — функциональный язык программирования, который устроен совсем иначе, чем популярные JavaScript, PHP, Python или Java — они являются императивными или смешанными языками разработки. При этом многие адепты Haskell считают, что разработчики, использующие императивные языки, должны хотя бы попробовать научиться чистой функциональной разработке ради глубокого понимания принципов самого программирования и разницы функциональной и императивной разработки. Мы попросили Haskell-разработчиков подробно рассказать о том, как устроен этот язык программирования, о своем опыте и отличиях функционального подхода от других существующих принципов программирования.","votes_count":25,"created_at":"2020-08-07T13:23:28.345Z","published_at":"2020-08-07T14:01:55.019Z","body":"**Haskell — функциональный язык программирования, который устроен совсем иначе, чем популярные JavaScript, PHP, Python или Java — они являются императивными или смешанными языками разработки. При этом многие адепты Haskell считают, что разработчики, использующие императивные языки, должны хотя бы попробовать научиться чистой функциональной разработке ради глубокого понимания принципов самого программирования и разницы функциональной и императивной разработки. Мы попросили Haskell-разработчиков подробно рассказать о том, как устроен этот язык программирования, о своем опыте и отличиях функционального подхода от других существующих принципов программирования.**\n\nВажной особенностью Haskell является то, что он поддерживает ленивые вычисления, которые позволяют сильно ускорить работу программы и снизить нагрузку на память, а также сделать код проще и модульнее. Ленивые вычисления выполняются тогда, когда это необходимо программе, а не в том моменте, когда их указал разработчик.\n\nВ обычных — не ленивых или «энергичных» вычислениях — аргументы функции вычисляются перед выполнением самой функции. В языках программирования, которые применяют ленивые вычисления, этот процесс постоянно откладывается, и аргументы функции вычисляются только для реальной надобности, а не в том месте, где их указал разработчик. Например, если сейчас значение какой-то функций не нужно и оно не используется, то Haskell не будет высчитывать ее аргументы.\n\n::programs\n\n## Содержание\n\n## Сферы применения Haskell\n\nHaskell сейчас используется чаще всего по нескольким основным направлениям. Достаточно часто Haskell применяют в финансовом секторе — крупные банки и другие компании, работающие на этом рынке, применяют его для разработки собственных инструментов. Бизнес применяет именно Haskell из-за гарантированности точности вычислений без ошибок.\n\nHaskell часто используют для написания инструментов для обработки текстов, синтаксического анализа и создания фильтр-систем для обработки спама. Структура Haskell позволяет достаточно просто заложить в него правила языка, в том числе и русского, и обучить алгоритмы находить взаимосвязи с ним.\n\n::youtube{id=\"tPWx0yC_Lbo\"}\n\nРазработчики также применяют Haskell для создания инструментов для тестирования кода на других языках программирования. Здесь используется примерно тот же алгоритм, что и в предыдущем пункте, поскольку Haskell можно легко применять не только для анализа обычных языков, но и языков программирования.\n\nПри этом Haskell можно применять и для веб-разработки, он может компилироваться в JavaScript для запуска в браузере, а на сервере запускаться в качестве быстрого машинного кода, который легко обрабатывает десятки тысяч одновременных подключений.\n\n## Эксперты — о необычности Haskell, его особенностях и перспективах\n\nМы попросили экспертов, которые работают с Haskell, рассказать об особенностях этого языка и о том, почему он развивает программистов.\n\n### Александр Гранин: Haskell, безусловно, помогает разработчику выйти на новый уровень\n\n\n\n**Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?**\n\nМоим первым языком был Basic, потом Pascal, а первым профессиональным языком был C++, за ним — C# и Python. Haskell я начал изучать 10 лет назад в качестве хобби, и инвестировал в него очень много времени. Профессионально я пишу на Haskell более трех лет. Ещё я пишу на PureScript — это язык, очень похожий на Haskell, но компилирующийся в JavaScript. И я даже написал фундаментальную книгу о том, как создавать реальные приложения на Haskell — [Functional Design and Architecture](https://leanpub.com/functional-design-and-architecture).\n\nЛюбопытно, что изучать Haskell как первый язык можно, и это будет даже легче, чем изучать его после 5-10 лет опыта в C++, Java, PHP, C#, Python, JavaScript и других мейнстримных языках. Это связано с тем, что мейнстримные языки исповедуют, в основном, императивную и объектно-ориентированную парадигмы. Долгое их использование ведет к образованию ментальных рельс, и опытному разработчику становится трудно с них соскочить и понять функциональную парадигму.\n\nОбратный эффект, вероятно, тоже есть: когда сначала изучаешь ФП, долго на нем пишешь, а потом традиционное ООП кажется очень неудобным и сложным. Но обратный эффект зафиксировать сложнее, так как не очень много людей начинали с Haskell или другого функционального языка.\n\nЕсть смысл в том, чтобы изучать Haskell в качестве первого языка. Это будет чуть-чуть сложнее, чем Python или Pascal, но не намного. На начальном уровне Haskell — довольно простой язык. Проблемы с его изучением возникают из-за его необычности, так как его синтаксис и набор базовых концепций стоит сильно в стороне от привычных Си-подобных языков. Haskell могут понять все. Однако его более продвинутое использование, конечно, требует значительной подготовки. Но я все-таки считаю, что нет ни одного языка, сложнее С++, — на всех уровнях (базовый/средний/продвинутый). А С++ повсеместно учат и повсеместно используют.\n\nВ качестве первого языка я бы все же посоветовал Python, но ни в коем случае на нем не останавливаться. Pascal — тоже вариант, Golang и даже Rust! На самом деле, с какого бы языка вы ни начинали, вы должны понимать, что на этом этапе важнее всего умение понять задачу, декомпозировать её на простые подзадачи, вплоть до мельчайших частей, составить алгоритм, его запрограммировать и отладить. \n\nС первым языком программирования вы должны изучать программирование как таковое, потому что навык составлять инструкции для компьютера — основополагающий. Без него дальнейшее продвижение в разработке невозможно. А какой там будет язык — это уже дело десятое, можно выбирать что-то себе по душе. И конечно же, через какое-то время нужно учить другие языки программирования. Лучше всего — из разных парадигм, тогда у вас будет наиболее полное представление о разработке, и как таковые языки перестанут быть загадочными. Вы сможете взять любой и разобраться в нем за считанные часы. Так что имеет смысл учить по одному или нескольким языкам из следующих категорий:\n\n- системные языки (Си, Rust, Assembler)\n- низкоуровневые статически типизированные языки с ручным управлением памятью (С++, Rust)\n- высокоуровневые языки с управляемой (managed) памятью и статической типизацией (C#, Java, Scala, Kotlin, Haskell, Go)\n- динамические языки (Python, JavaScript, PHP, Clojure, Ruby, Erlang)\n- императивные языки (Си, С++, Rust, Go)\n- объектно-ориентированные языки (Java, C#, Ruby, C++, JavaScript, PHP)\n- функциональные языки (Haskell, Scala, Clojure, Erlang)\n- логические языки (Prolog)\n\nУчить, конечно, не за один присест, но постоянно, методично и планомерно.\n\n**Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?**\n\nHaskell, безусловно, помогает разработчику выйти на новый уровень. И дело не только в функциональной парадигме. И даже не в том, какие новые языковые конструкции предлагает Haskell (например, алгебраические типы данных и паттерн-матчинг — то, чего так не хватает в других языках). Дело в том, как программист начинает структурировать код. Если программист пишет код-лапшу, не отделяет чистые функции от нечистых, не стремится к тестируемости кода, и в принципе пишет «грязный» ([по Роберту Мартину](https://www.ozon.ru/context/detail/id/5011068/)) код, то функциональное программирование ему будет даваться тяжело. Такой код не композируется, плохо управляется, и, в целом, противопоказан в функциональных языках. \n\nНа самом деле, практики чистого кода важны во всех языках, во всех парадигмах, и must-follow всеми профессиональными разработчиками. Но функциональные языки, в частности Haskell, предъявляют больше требований. Так например, в Haskell деление на чистые и нечистые функции вшито в сам язык. Там всё еще можно «хачить» код и не задумываться, но функциональная природа Haskell будет этому сопротивляться. Кстати — это частая причина того, что Haskell не заходит разработчикам. Код в стиле «поток сознания» будет работать очень плохо, если его вообще удастся написать. А традиционные языки никак такому стилю не препятствуют.\n\nПрограммисты на JavaScript могут гордиться: их язык, а также Scala, затащили функциональное программирование в мейнстрим. JS — весьма функциональный язык, хотя конечно, там присутствуют и другие парадигмы. Но изучать Haskell полезно вообще всем профессиональным разработчикам. Тому есть несколько причин.\n\n- Haskell — это «идиоматичное функциональное программирование». Это эталон функционального программирования со статическими типами. И он же — источник огромного количества идей и приемов, которые перенимают другие языки. Так, многие фреймворки в JS имеют функциональные черты, а еще есть популярные библиотеки (ramda) для ФП. C++ как язык в последние годы развивается в сторону функционального программирования. В нем, например, появилась библиотека ranges, предлагающая чисто функциональные инструменты обработки коллекций. И, на самом деле, аналогичные вещи уже были в C# (Linq) и Java (streams). Всё это порождения функциональной парадигмы, напрямую заимствующие из Haskell подходы и идеи. Я это утверждаю вполне серьезно, потому что общался с авторами этих подходов, и они не скрывают источника вдохновения — Haskell. Для всех мейнстримных языков есть даже доклады, показывающие, как концепции из Haskell заимствуются и перетекают в другие экосистемы. Я и сам сделал 7 (семь) докладов о функциональном С++. И можно сделать еще столько же, — так много всего функционального происходит в modern C++. Поэтому изучение Haskell дает очень много подсказок о том, как писать на других языках.\n\n- Haskell дает разработчику очень много новых инструментов: иммутабельность, чистые функции, монады, алгебраические типы данных, pattern-matching, стройная система типов, отличный вывод типов, функционально-декларативный стиль кода. Это всё то, чего очень не хватает в мейнстримных языках. Сейчас многие концепции туда перетекают, так как они доказали свою полезность. Если разработчик претендует на роль старшего, лида или архитектора, его инструментарий должен быть как можно шире. И современный мир накладывает такое требование: нужно знать и ООП, и ФП. А ФП лучше всего изучить в его самом правильном проявлении — Haskell.\n\n- Haskell очень расширяет сознание. Писать на нем — очень приятно. Ни один другой язык не может предоставить такой уровень уверенности в коде. Разработчик чувствует, что написанный и скомпилированный код на Haskell будет надежен, и даже со временем не потеряет этой надежности. Такого уровня гарантий ни один другой язык предоставить не может. Например, код на С++ легко может взорваться на каждом шагу, и часто — непонятно почему. Undefined behavior поджидает за каждым углом, ничему нельзя доверять, ни на какую часть кода нельзя полагаться. Это очень неприятно, и крайне осложняет разработку. Изучать Haskell нужно уже хотя бы потому, что он показывает, какое приятное может быть программирование.\n\n**Какие есть особенности у Haskell? Какие очевидные плюсы и минусы есть у этого языка?**\n\nГлавная особенность языка заключается в том, что Haskell предлагает совершенно иной взгляд на то, как писать программы. Сейчас уже неоспоримо, что функциональное программирование — это следующая большая парадигма после объектно-ориентированного, и что тренд будет только усиливаться. А значит, есть возможность запрыгнуть на этот поезд и оказаться в числе первых. Функциональное программирование — это не просто модное направление, это способ решать те же задачи более удобным, лаконичным и понятным способом. А еще решать новые задачи, которые было сложно решить на традиционных языках.\n\nОчевидные плюсы Haskell как такового — это разделение на чистый и нечистый слои на уровне языка (монада IO), иммутабельность, полезные монады (Maybe, Either, List), алгебраические типы данных, богатый набор примитивов для конкурентного программирования (Software Transactional Memory, MVar). При этом с использованием продвинутой системы типов можно следовать подходу “make invalid state irrepresentable” (то есть, невалидные состояния программы запрограммировать просто нельзя). Haskell — это очень консистентный язык, из-за этого у вас появляется понимание, что в других языках сделано правильно, а что не очень, повышается осознанность их использования. \n\nКонцепции из Haskell тоже очень полезны, а если вы пишете многопоточный код, то Haskell предлагает целый клондайк подходов и идей, помогающих бороться со сложностью и повышать надежность программ. Еще одна хорошая сторона — большое количество учебных материалов по Haskell: написаны разные книги, статьи, туториалы, есть видеокурсы и упражнения. И всегда есть у кого попросить помощи. В Haskell есть свои системы сборки и свои пакетные менеджеры (stack и cabal), и они работают замечательно, да и компилятор GHC генерирует оптимизированный, сравнительно быстрый код (не хуже Java c JVM).\n\nМинусы у Haskell, конечно, есть. Сложность верхнеуровневых type-level концепций, неудовлетворительная работа с рекордами, подводные камни его ленивой природы. Есть проблемы и с экосистемой, и они, пожалуй, более существенны. Развитие единственного компилятора — GHC — происходит неравномерно, иногда с потерей обратной совместимости. Документация на библиотеки часто плохая, и сами библиотеки оставляют желать лучшего. Для большинства типичных задач библиотеки есть, но решение нестандартных задач будет затруднено. Практики и подходы разработки больших приложений только установились, но еще предстоит пройти большой путь. \n\nКроссфплатформенность — еще одна проблема. Haskell замечательно работает под Linux и MacOS, а с Windows есть некоторые проблемы. К сожалению, направление Windows не в приоритете у разработчиков GHC. Наконец, — и для кого-то это очень важно, — для Haskell нет хороших IDE. Предпринимались разные попытки их создать, но пока что можно рассчитывать только на элементарную подсветку синтаксиса и наивное автодополнение по словарю. Более продвинутые фичи (навигация и рефакторинг) в разных плагинах либо забагованные, либо не справляются с разумно большими проектами.\n\n**В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?**\n\nК сожалению, этот миф очень мешает. Haskell видят как академический язык, а между тем он очень практичен, и он готов к production. Хаскеллисты тоже не все академики, и даже не все знают глубокую математику. Это и правда миф. Не нужно знать ни Теорию Категорий, ни Лямбда-Исчисление, ни другую продвинутую математику, чтобы писать на Haskell полезные программы. В сообществе есть люди, которые занимаются очень умными вещами на границе Computer Science, и им математика нужна. Но также есть и другие люди, которые успешно разрабатывают коммерческие продукты на Haskell без потребности в глубоких математических концепциях. \n\n\n> ### Читайте также:\n> DevOps — что это такое и почему эти практики меняют мир разработки [уже сейчас](https://ru.hexlet.io/blog/posts/devops-chto-eto-takoe-i-pochemu-eti-praktiki-menyayut-mir-razrabotki-uzhe-seychas)\n\nНапример, я изучаю Haskell десять лет, и пишу на нем профессионально более трех, но не математик, и ничего кроме остаточных знаний от университетской программы у меня в голове нет. Тем не менее, я вполне успешен. Даже более успешен, чем с языками C++, C# и Python.\n\nКак индустриальный инструмент, Haskell хорошо зарекомендовал себя во многих областях: распределенные, многопоточные и конкурентные приложения, финансовые приложения, компиляторы, инструменты обработки данных, веб-бэкенды и десктопные приложения. Об этом можно почитать статью Гонзалеса “[State of the Haskell ecosystem](https://github.com/Gabriel439/post-rfc/blob/master/sotu.md)”.\n\nА вот фреймворки — это интересная тема. Долгое время в сообществе отрицалась необходимость фреймворков. Это было время, когда практики и подходы промышленной разработки на Haskell даже не начали оформляться. Но в последние годы всё изменилось, и я тоже приложил к этому значительные усилия. Сейчас в Haskell есть ряд фреймворков и архитектурных библиотек, которые набирают популярность. Возможно, я автор наибольшего числа фреймворков во всем мировом Haskell-сообществе, потому что я их сделал более четырех.\n\n- Hydra — полноценный фреймворк для создания web-бэкендов, многопоточных и конкурентных приложений. Позволяет работать с SQL DB, с KV DB, поддерживает логгирование, процессы, подсистему для взаимодействия с консолью. Hydra — это даже не один, а целых три фреймворка, основанных на разных движках, чтобы было можно сравнивать между собой разные подходы и дизайн. Hydra — преимущественно демонстрационный проект, который я использую для своей книги, но эти же идеи легли в основу коммерческих фреймворков, которые я создал для разных компаний.\n- Node — фреймворк для создания распределенных приложений. В его основе лежит та же самая методология, на которой базируются все мои фреймворки.\n- PureScript Presto — фреймворк для написания мобильных приложений. Это другой язык, PureScript, но он очень похож на Haskell, и является его идейным продолжателем. PureScript компилируется в JavaScript, и его главная платформа — это web.\n- PureScript Presto.Backend — фреймворк для web-бэкендов, который унаследовал дизайн у PureScript Presto. Оба фреймворка активно используются в индийской финансовой компании Juspay и являются ее ключевыми технологиями. На них построено очень популярное мобильное приложение для денежных переводов, а также платежный сервис и бэкенд.\n\nЭти фреймворки доступны в Open Source, но есть еще два коммерческих фреймворка, оба в компании Juspay, которые я для них создал, но они ещё не опубликованы.\n\nЧто касается других фреймворков, то у нас есть:\n\n- Yesod — web framework;\n- Snap — web framework &amp; HTTP server;\n- Servant — HTTP server;\n- IHP: Integrated Haskell Platform — фреймворк для сервер-сайд рендеринга;\n- ...и другие, частичный список которых можно найти [здесь](https://wiki.haskell.org/Web/Frameworks).\n\n**Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?**\n\nВакансий на Haskell сейчас не очень много. Доля рынка у этого языка очень маленькая. И хотя она растет, и появляются новые компании, делающие на него ставку, все равно их на два-три порядка меньше, чем у самых популярных языков. Тем не менее, становится проще отслеживать вакансии, проще взаимодействовать с работодателями. У нас есть ряд ресурсов, где постятся предложения: [Reddit](https://www.reddit.com/r/haskell), [чат в Телеграме](https://t.me/haskell_job), тематические чаты. Эти вакансии не постятся на HeadHunter и подобных сервисах, потому что более выгодно прийти в сообщество и обратиться к нему напрямую. Но надо сказать, что есть некоторое превышение спроса над предложением. Хаскеллистов требуется больше, чем их есть, особенно таких, которые умеют решать задачи бизнеса. Возможно, для старта карьеры Haskell подходит не очень, но если вы обрели почву под ногами в других экосистемах, то Haskell может стать очень приятным продолжением.\n\n**Будет ли Haskell востребован в будущем?**\n\nЕсть опасения, что Haskell может перестать привлекать даже то внимание, которое привлекает сейчас. Риск связан с тем, что традиционные языки надежно удерживают лидерские позиции, и приходят новые языки, перенимающие из Haskell все самое лучшее. Такой, например, Rust. Стартовав совсем недавно, он обгонит Haskell по популярности, и есть очень большой смысл инвестировать в Rust, пока это еще не стало мейнстримом. \n\nВ то же время, ближайшие пять лет Haskell всё еще будет присутствовать на рынке, потому что есть ряд компаний, где он зарекомендовал себя очень хорошо. Не могу сказать, что его будущее безоблачно, но выражаю осторожный оптимизм. Потому что я сам прикладываю большое количество усилий, чтобы популярность Haskell в индустрии росла, чтобы он всегда оставался с нами и продолжал приносить пользу и радость.\n\n### Владислав Завьялов: Haskell позволяет понять программирование глубже, ведь именно через него можно освоить концепции функционального программирования\n\n\n\n**Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?**\n\nПервым языком я изучал BASIC. Потом были Pascal, C++, C#, Python. Опыт с этими языками у меня был поверхностный, но достаточный, чтобы начать задаваться вопросом: неужели нельзя сделать язык получше? Мне хотелось помощи от компилятора в написании корректного кода. Статическая проверка типов, автоматическое управление памятью, неизменяемые данные. В итоге мне посоветовали попробовать Haskell. С первых строк [книги](http://learnyouahaskell.com/introduction) о нем я понял, что нашел язык для себя: чистые функции, ленивые вычисления, статическая типизация.\n\nЕсли бы я начал с Haskell как первого языка, то не смог бы оценить его по достоинству. Только после опыта борьбы с сегфолтами, рантайм-ошибками, и неконсистентным изменяемым состоянием, функциональное программирование представилось глотком свежего воздуха. Когда я стал искать первую оплачиваемую работу, то наверняка знал только одно: это должна быть разработка на Haskell. Так что весь мой опыт коммерческой разработки именно на Haskell.\n\nУ каждого человека, так или иначе, будет свой путь в программировании, и Haskell — это такая же неплохая отправная точка, как любая другая. Так что если кто-то хочет изучать Haskell как первый язык, я это только поддерживаю.\n\n**Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?**\n\nБезусловно, Haskell позволяет понять программирование глубже, ведь именно через него можно освоить концепции функционального программирования. Но это действует и в обратную сторону: программисту на Haskell полезно изучить JavaScript и написать на нем что-то нетривиальное.\n\nВ целом, полезно осваивать языки, максимально непохожие друг на друга, представляющие разные парадигмы. Только увидев и ощутив совершенно разные подходы к решению задач можно осознать, где фундаментальная сложность задачи, а где недостатки того или иного инструмента.\n\nЯ написал про это [статью](https://serokell.io/blog/10-reasons-to-use-haskell): десять причин использовать Haskell. В ней я называю следующие особенности Haskell:\n\n- Безопасное управление памятью, сборка мусора\n- Компиляция в нативный код\n- Статическая типизация, развитая система типов\n- Чистые функции\n- Ленивые вычисления\n- Многопоточное программирование\n- Метапрограммирование (генерация кода)\n\nНекоторые из этих особенностей — например, сборка мусора, есть и у более популярных языков. Некоторые из них, такие как ленивые вычисления, больше практически нигде не встречаются. Но именно их совокупность делает Haskell хорошим языком для разработки библиотек и приложений.\n\nИз минусов: есть случаи, когда Haskell не подходит. Например, для фронтэнда веб-приложений лучше выбрать язык, который дает на выход компактный и быстрый JavaScript. При этом для вычислений в реальном времени, паузы на сборку мусора могут быть неприемлемы. Но в большинстве случаев Haskell подходит хорошо.\n\n**В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?**\n\nКонечно, можно на Haskell реализовать решатель системы линейных уравнений и неравенств. Думаю, все согласятся — это математика. Но это же делается для какой-то цели, а не просто так. Например, в Cassowary ([https://overconstrained.io](https://t.co/GIvvM6hgHu?amp=1)) такие системы неравенств предлагается решать в графических интерфейсах пользователя, чтобы расположить элементы интерфейса на плоскости экрана. И там есть много реализаций на разных языках, на том же JavaScript их больше пяти, а на Haskell только одна. То есть выходит, что это JavaScript язык для математики? Или что Haskell это язык для графических интерфейсов пользователя?\n\nЯзык программирования – это формальная система для того, чтобы излагать инструкции для компьютера, а математика может как изучать формальные системы, в том числе языки программирования, так и подсказать, что в этих формальных системах следует выразить, чтобы решить какие-то прикладные задачи. Сама по себе математика задачей не является, а поэтому языка программирования для нее быть не может.\n\nHaskell может применяться для всех тех же задач, что и другие языки, такие как Python, C#, Java, в том числе для написания бэкндов веб-приложений, прикладных программ с графическим интерфейсом или интерфейсом командной строки, системных утилит, компиляторов, систем анализа и обработки данных, и чего угодно еще. Из фреймворков, хочу отметить [Servant](https://hackage.haskell.org/package/servant]). Это отличный способ написать веб-сервис на Haskell.\n\n**Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?**\n\nПериодически я вижу, как ищут Haskell-разработчиков. Но конкуренция за эти места достаточно сильная: Haskell приходится по нраву многим разработчикам, и на вакансии быстро находятся желающие. Поэтому надо готовиться к тому, что ожидания у работодателя будут высокими.\n\n**Будет ли Haskell востребован в будущем?**\n\nПосмотрим! Язык продолжает развиваться, с каждой версией компилятора добавляется что-то новое и интересное. Мне видится, что Haskell набирает обороты.\n\n### Алексей Пирогов: На Haskell пишут значительно более разнообразное ПО, чем на том же PHP\n\n\n\n**Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?**\n\nЯ изучал Haskell, уже будучи профессиональным программистом. При этом смысл изучать Haskell в качестве первого языка действительно есть — можно научиться ФП до того, как голова окажется забита всякой «процедурщиной».\n\n**Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?**\n\nHaskell позволит по-настоящему пощупать функциональное программирование в естественной для него среде, а не в качестве пристройки к процедурному языку. При этом элементы функционального программирования есть и в PHP или JavaScript, но погружение в функциональную среду позволит применять эти элементы правильно и к месту.\n\nСтатический анализ кода и проверка типов сегодня используются в том числе и применительно к изначально динамически типизированным языкам — даже к языкам со слабой динамической типизацией, таким как JavaScript или PHP. Haskell же не только статически типизирован, статическая типизация в Haskell — сильная. А это сам по себе сильный «сдвиг парадигмы». Но и кроме смены вида типизации, меняется сам подход к проектированию: вы пишете код от типов — Type-Driven Development. Более того, часто компилятор пишет код за вас — опираясь на описанные вами типы. Это не только интересно, но и практично.\n\n**В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?**\n\nНа Haskell пишут значительно более разнообразное ПО, чем на том же PHP. Тут вам и высокоскоростной трейдинг (HFT) и сворачивание белков, и синтез электронных схем, вычисления на GPU. Например, в Facebook на Haskell написана подсистема фильтрации спама: на специальном мини-языке (DSL) пишутся правила фильтрации, а потом весь набор правил компилируется в высокоэффективный машинный код — это ещё одно отличие от интерпретируемых JS и PHP. \n\nHaskell — язык общего назначения, подходит он для многого. Можно и Web писать: Haskell компилируется в JavaScript для запуска в браузере, а на сервере запускается быстрый машинный код, легко обрабатывающий десятки тысяч одновременных подключений. Имеются даже фреймворки для некоторых областей: для Web это Servant, Scotty, в других же не принято использовать фреймворки вообще: в ФП принято композировать функции, и фреймворк не нужен, когда функций достаточно и они хорошо композируются.\n\n**Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?**\n\nРабота есть. Если хочется full-time писать на Haskell, то вы всегда найдёте, где это можно делать. Да, язык — не мейнстримовый, но сказать, что на нём никто не пишет, нельзя. Про сочетания с инструментами сказать сложно: опять же всему виной разнообразие задач, которые решаются на Haskell. В Web используют СУБД, такие как PostgreSQL, frontend-серверы — по типу Nginx.\n\n**Будет ли Haskell востребован в будущем?**\n\nИнтерес к ФП в целом — растёт, и сам по себе Haskell активно развивается. OpenSource библиотеки покрывают все большее количество областей. И работы тоже становится больше, в том числе и в наукоёмких областях — ML, компьютерное зрение, квантовые вычисления, биоинформатика. Так что, да, я считаю, язык Haskell будет востребован в будущем.\n\n## Дмитрий Коваников: Изучить Haskell будет полезно каждому разработчику, даже если они не планируют связывать свою карьеру с этим языком\n\n\n\n**Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?**\n\nДо знакомства с Haskell я несколько лет уже программировал на Java, Kotlin и C++, поэтому Haskell не был моим первым языком программирования, но он был первым функциональным языком, который я использовал. По своему опыту преподавания Haskell я могу сказать, что он вполне подходит и в качестве первого языка. Сам Haskell вполне самодостаточен и не содержит в себе принципы, требующие изучения других языков заранее.\n\n**Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?**\n\nПолностью согласен с этим утверждением. Я считаю, что изучить Haskell будет полезно каждому разработчику, даже если они не планируют связывать свою карьеру с этим языком. Haskell содержит уникальный набор фич: ленивость, чистота и иммутабельность по умолчанию, функции высших порядков, паттерн-мэтчинг, алгебраические типы данных, тайпклассы, и т. д. Почти каждую из этих фич можно найти в каком-то другом мейнстримовом языке, но именно такое их сочетание приводит к особенному стилю программирования. Те вещи, которые в других языках считаются лучшими практиками или паттернами программирования, в Haskell выражаются естественным образом. Когда пытаешься решать реальные задачи в таком стиле, и когда язык заставляет тебя постоянно думать и писать в таком стиле, то начинаешь и на других языках видеть способы применения этих техник для написания более корректного и поддерживаемого кода.\n\n\n> ### Читайте также:\n> Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты [восхищаются им](https://ru.hexlet.io/blog/posts/clojure)\n\nС точки зрения профессионального роста, Haskell помогает лучше понять и применить следующие подходы:\n\n- Декомпозиция бизнес логики на более маленькие и независимые части, которые затем можно легко объединять и комбинировать.\n- Выражение состояний программы и различной логики через типы данных.\n- Использование алгебраических абстракций для описания высокоуровневого интерфейса.\n- Многопоточное программирование через более удобные примитивы.\n\nНапример, разделение бизнес логики на чистые функции по валидации данных и функции с сайд-эффектами по работе с БД полезно и в PHP, и в Java, но именно в Haskell компилятор заставляет писать в таком стиле. Можно считать, что компилятор Haskell, как внимательный ментор, не даст написать код, в котором легко ошибиться. И именно поэтому он заставляет прокачаться — чтобы написать работающий код, необходимо выполнить все правила компилятора и структурировать код в естественном для языка стиле.\n\nОсновной особенностью Haskell является то, что он заставляет думать и программировать в декларативном стиле. Вместе того, чтобы шаг за шагом описывать, что делать с текущими переменными, приходится думать о том, как трансформировать одни данные в другие, какие комбинаторы для этого использовать и как структурировать код. Я бы сказал, что после многих лет программирования на императивных языках, программирование на Haskell может очень сильно освежить. Рекомендую всем, кто в поиске новых челленджей и изучения нового.\n\nИз положительных сторон Haskell:\n\n- Самый большой плюс — создание легко-поддерживаемого кода. Компилятор является очень большим помощником! Гниение кода очень легко избежать, и даже если не трогать проект 2 года, можно вернуться к нему, и он по-прежнему будет работать. Более того, его легко можно будет обновить.\n- Очень легко рефакторить код, и, более того, есть уверенность в том, что рефакторинг не сломает бизнес-логику. Любое легаси можно перевести на современные подходы без необходимости переписывать проект заново.\n- Изначально получается написать более корректный код в среднем, так как язык по дизайну помогает избежать большого класса ошибок в программах.\n- Haskell постоянно развивается и пополняется фичами, недоступными в других языках, так как обычно ресёрч в области PL происходит на Haskell. Исследователи находят очень привлекательным тот факт, что языком пользуется много людей для решения практических проблем, поэтому стараются придумывать более полезные фичи, которые позволят решать задачи более эффективно.\n- Удобные примитивы для написания многопоточного кода: Software Transactional Memory, библиотека async, и т. п.\n- Эффективная рантайм система: легковесные потоки, два вида сборщика мусора для различных юзкейсов, множество способов профилировать и анализировать рантайм статистику, и т. п.\n- Не у всех проблем есть установленные решения, поэтому люди всегда экспериментируют с новыми подходами и пытаются искать более удобные и эффективные способы решения существующих проблем.\n- Меньше церемоний: бизнес-логика более явно видна в приложении, а не прячется за слоями деталей реализации, очень много инструментов избавления от бойлерплейта, сам язык довольно лаконичный и элегантный, идеи из головы более прямо и быстро транслируются в рабочий код.\n\nНо и минусы есть, а именно:\n\n- Haskell — один из немногих языков, которым одновременно активно пользуются и люди для теоретических исследований в области PL, и промышленные программисты. Поэтому, например, не всегда можно найти библиотеку с API какого-нибудь сервиса. Или, если у автора библиотеки более академическая наклонность, то документация будет использовать более научные термины. В то время как мейнстримовые языки создавались целенаправленно для решения проблем из продакшна, Haskell пользовался большей популярность у академиков. Это преимущество с одной стороны, так как в основах стандартных библиотек и фреймворков лежат более фундаментальные абстракции. Но с другой стороны, у некоторых практических проблем только непрямые пути эффективного их решения.\n- Время комп��ляции проектов бывает очень долгим, особенно когда используешь продвинутые фичи языка.\n- Сообщество языка немного раздроблено: соревнующиеся билд-тулы, веб-фреймворки, и т. п. Иногда это затормаживает развитие и улучшение библиотек, так как для интеграции со всеми инструментами приходится использовать только фичи, которые поддерживают все.\n\nВ целом, я считаю, что сейчас плюсы перевешивают минусы, и многие минусы решатся со временем. Они не являются какими-то фундаментальными ограничениями языка, просто требуется больше времени и людей, чтобы всё улучшить.\n\n**В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?**\n\nЯ абсолютно не согласен с утверждением, что Haskell — язык для математики. Я на Haskell пишу бэкенд веб-сервисов, CLI тулы, библиотеки декондинга, логирования, БД.\n\nВ бэкенде типичного веб-приложения можно встретить следующие библиотеки:\n\n- servant — веб-фреймворк для описания REST API\n- postgresql-simple — библиотека для общения с PostgreL\n- co-log — библиотека логирования\n- aeson — парсинг JSON объектов\n- bcrypt — хеширование паролей\n- ekg — мониторинг запущенного сервера\n- blaze-html — eDSL для генерации HTML\n- hspec и hedgehog — фреймворки для юнит- и проперти-тестирования\n- proto-lens — генерация Haskell типов данных из protobuf сообщений\n- и очень много других библиотек для решения типичных проблем\n\nТак как в Haskell есть сборщик мусора, то язык не подходит для написания проектов, где требуется больший контроль над управлением памяти. В таких областях лучше выбрать Rust, C++, C. Но везде, где можно использовать Java, PHP, Ruby, Scala, Go, можно так же использовать и Haskell: бекенд веб-приложений, сервисы, CLI тулы, IDE, компиляторы, анализаторы кода — тут Haskell особенно хорошо подходит.\n\n**Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?**\n\nНа программистов со знанием Haskell есть спрос. В еженедельной рассылке Haskell Weekly каждый раз бывают вакансии от компаний, которые ищут Haskell-разработчиков. Особенно популярен Haskell у стартапов, так как им не нужно интегрироваться с существующими системами и есть возможность использовать продуктивные инструменты.\n\nОбычно компании, которые используют Haskell, склоняются в сторону функциональных языков (и инструментов в общем), поэтому помимо знания Haskell в требования можно встретить SQL, Elm/PureScript, Nix, Rust.\n\n**Будет ли Haskell востребован в будущем?**\n\nОднозначно будет. Язык продолжает развиваться и улучшаться, каждые полгода выходит новая версия компилятора с новыми фичами, улучшениями перформанса и багфиксами. Всё больше и больше компаний используют Haskell, а ресёрч в области PL не прекращает развиваться.\n\n### Денис Москвин: Будущее, в котором Haskell востребован, выглядит гораздо более упорядоченным и разумным\n\n\n\n**Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?**\n\nКогда я изучал свои первые языки, Haskell еще не было. Это 80-е годы прошлого века, тогда в СССР были более-менее широко доступны Fortran, Basic, Pascal и C. Функциональными языками если кто-то и занимался, то очень локально, я про них ничего тогда не слышал. Впрочем, я по образованию физик, поэтому нам языки программирования преподавали главным образом в контексте научных расчетов.\n\nHaskell в качестве первого языка можно было бы попробовать преподавать, но, если речь о детях 11-13 лет, то нужно очень аккуратно продумать методику. В целом я даже не очень понимаю, как оценить успешность подобного эксперимента. Очевидно, что если это будет делать энтузиаст Haskell с хорошими педагогическими скиллами, то результат будет довольно приличный. Но насколько это масштабируется в более-менее массовое образование — непонятно.\n\n**Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?**\n\nHaskell — чисто функциональный типизированный язык с нестрогой (ленивой) моделью исполнения. Функциональное программирование в целом, и Haskell, как один из наиболее чистых представителей этой парадигмы, позволяет программисту освоить новый, нетрадиционный подход к написанию программ. В императивных языках программа — это последовательность инструкций, в функциональных программа — это выражение. Это довольно сильное отличие, не только в синтаксисе, но и в модели исполнения. Например, все структуры данных иммутабельны, то есть не изменяются после создания. Благодаря этому свойству, мы получаем большой набор гарантий относительно поведения программ. Более того, эти гарантии известны не только нам, но и компилятору, что позволяет ему выполнять довольно высокоуровневые оптимизации.\n\nВыражениям, в отличие от инструкций, легче приписывать типы. Поэтому в Haskell очень богатая и стройная система типов, при этом программисту почти не требуется указывать типы вручную — подсистема вывода типов делает это за него.\n\nЛенивая модель вычислений позволят не вычислять те подвыражения большого выражения, которые не нужны для получения конечного результата, Это дает, например, возможность описывать потенциально бесконечные структуры данных, например, список всех нечетных натуральных чисел [1,3..]. И работать с ними так же как с обычными конечными структурами.\n\nПри этом все стандартные практики и идеи из функциональных языков можно напрямую использовать в традиционных императивных. Тем не менее, представление о таких практиках и понимание того, как все это работает, безусловно делает программиста более компетентным. Haskell, как чисто функциональный язык, позволяет познакомиться с подобными практиками в «дистилированном» виде, в отличие от «смешанных» языков, вроде Scala или Closure.\n\n**В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?**\n\nПрофессиональные математики не особо используют языки программирования в своей повседневной работе. Они, главным образом, теоремы формулируют, доказывают и статьи про это пишут. Сам Haskell и его модель вычислений действительно базируются на хорошо проработанной математической теории. Но это плюс, а не минус: в стандарте языка почти нет темных углов и плохо совместимых свойств.\n\nЧто касается использования Haskell, то это язык общего назначения, на нем можно писать практически любой код. Большинство популярных прикладных библиотек портированы на Haskell и доступны на Hackage — центральном репозитории пакетов. Основные инструменты работы — компилятор Glasgow Haskell Compiler (GHC) и поставляемый с ним интерпретатор GHCi, Cabal — инструмент создания пакетов и их дистрибуции, инструменты для поиска в документации (Hoogle и Hayoo) и для её генерации (Haddoc).\n\nОбычно на Haskell реализуют проекты с нетривиальными схемами обработки данных. Это связано с тем, что для стандартных схем существует огромное количество популярных и развитых фреймворков, привязанных к экосистемам конкретных языков. В коммерческой разработке Haskell довольно активно используют в финансовом анализе, в инженерном обеспечении технологий на базе блокчейна, есть несколько успешных команд, использующих его в прикладной биоинформатике.\n\n**Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?**\n\nНекоторый спрос есть, но он довольно нишевый.\n\n**Будет ли Haskell востребован в будущем?**\n\nБудущее, в котором Haskell востребован, выглядит гораздо более упорядоченным и разумным. Поэтому будем на это надеяться.\n\n::posts\n\n_______________________\n\nНа Хекслете сейчас нет курсов изучения Haskell, однако есть отдельный курс по функциональному [программированию](https://ru.hexlet.io/courses/js-functions-hard-way) для JavaScript, [вебинар](https://youtu.be/TjDEeaohNog) на эту тему от разработчика Никиты Соболева или [программиста](https://www.youtube.com/watch?v=vN3Ac0dwXdk) Александра Гранина, [бесплатный курс](https://ru.code-basics.com/languages/racket) по языку Racket и [небольшой курс](https://ru.hexlet.io/courses/erlang_101) по функциональному языку программирования Erlang. Кроме того, на нашем сервисе Codebattle [есть](https://codebattle.hexlet.io/) возможность выбрать Haskell и решать задачи на этом языке.\n\n\n> ### Никогда не останавливайтесь:\n> В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть [сотни курсов по разработке на разных языках и технологиях](https://ru.hexlet.io/courses?from=blog)","reading_time":23,"url":"https://ru.hexlet.io/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki","cover_thumb_variant":null,"cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp","cover_main_variant":"/vite/assets/blog_post-7eTyeLLt.webp","related_stacks_count":5},"relatedPosts":[{"model_name":"BlogPost","id":926,"title":"Библиотека React: особенности, перспективы, ситуация на рынке труда","slug":"biblioteka-react-review-article","summary":"В объявлениях о поиске программистов часто встречается требование уметь работать с React. Иногда работодатели ожидают знания React не только от фронтендеров, но и от бэкенд-разработчиков. Почему эта библиотека настолько популярная, стоит ли изучать её сегодня, каковы её перспективы по мнению опытных программистов? Ответы на эти и другие вопросы читайте в обзорной статье.","created_at":"2020-07-08T15:15:00.191Z","published_at":"2024-02-29T07:46:44.876Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTYyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--6bac7610f325471938a0e33f58eaa4c52527d66f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%87%D1%82%D0%BE%D1%82%D0%B0%D0%BA%D0%BE%D0%B5react-01.png"},{"model_name":"BlogPost","id":416,"title":"Язык программирования JavaScript: где его используют и почему он популярен","slug":"stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov","summary":"Рассказываем, что это за язык программирования — JavaScript, где его используют, насколько он популярен и с чего начать изучение JavaScript.","created_at":"2019-07-26T08:17:06.287Z","published_at":"2023-10-04T08:41:58.734Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMywicHVyIjoiYmxvYl9pZCJ9fQ==--aa69869c906a992728ba7c26886fa1b715024424/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%8F%D0%B7%D1%8B%D0%BA%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8Fjavascript-01.png"},{"model_name":"BlogPost","id":480,"title":"Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят","slug":"zachem-izuchat-node-js-ili-o-perspektivah-bekenda-na-javascript","summary":"Рассказываем, как устроен бэкенд на JavaScript, стоит ли изучать Node.js, когда есть PHP и Python, какое будущее у этой технологии и сколько платят программистам на Node.js.","created_at":"2019-09-27T08:33:36.150Z","published_at":"2023-07-28T13:31:55.753Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY4MywicHVyIjoiYmxvYl9pZCJ9fQ==--8e5dd13a34bb6d61f1c0db87a25e6e64d0e237fb/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/node%20_new-01.png"}],"category":{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},"mainStackCategory":{"id":11,"name":"Курсы по Java","slug":"java","short_name":"Java","order":80,"state":"published","category_slug":"courses_java"},"categories":[{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},{"id":3,"name":"Истории успеха","slug":"success","state":"published","created_at":"2016-07-30T12:57:18.308Z"},{"id":14,"name":"Дневник студента","slug":"student-diary","state":"published","created_at":"2019-02-25T13:27:09.471Z"},{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},{"id":12,"name":"Карьера","slug":"career","state":"published","created_at":"2017-07-21T15:42:21.481Z"}],"relatedLandings":[{"stack":{"id":36,"slug":"java-sicp","title":"СИКП на Java","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4100,"duration_in_months":1},"id":60,"slug":"java-sicp","title":"СИКП на Java","subtitle":"Навык понимать программы на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Изучите фундаментальные принципы программирования на Java","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"java-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"},{"stack":{"id":20,"slug":"js-sicp","title":"СИКП на JS","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4050,"duration_in_months":1},"id":28,"slug":"js-sicp","title":"СИКП на JS","subtitle":"Навык понимать программы на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Навык фундаментального программирования","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"js-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"},{"stack":{"id":28,"slug":"php-sicp","title":"СИКП на PHP","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4010,"duration_in_months":1},"id":44,"slug":"php-sicp","title":"СИКП на PHP","subtitle":"Навык понимать программы на глубоком уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Навык фундаментального понимания программ на PHP","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"php-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MywicHVyIjoiYmxvYl9pZCJ9fQ==--61c43d4881ca8feecc6f37dfafdc4e304f34b52f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"},{"stack":{"id":35,"slug":"ruby-sicp","title":"СИКП на Ruby","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":null,"duration_in_months":1},"id":58,"slug":"ruby-sicp","title":"СИКП на Ruby","subtitle":"Навык понимания программ на фундаментальном уровне, помогающий уверенно проходить собеседования и увеличивать доход","subtitle_for_lists":"Изучите фундаментальные принципы программирования на Ruby ","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"ruby-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1NywicHVyIjoiYmxvYl9pZCJ9fQ==--bd2826bc88b4074fdf555368020c1fc0ac0705c1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"},{"stack":{"id":37,"slug":"python-sicp","title":"СИКП на Python","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4150,"duration_in_months":1},"id":62,"slug":"python-sicp","title":"СИКП на Python","subtitle":"Навык понимать код на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Изучите Python на глубоком уровне для решения сложных задач","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"python-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1OCwicHVyIjoiYmxvYl9pZCJ9fQ==--023ea18f500b1c4c91617fa96bbc52df8395da39/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"}]},"url":"/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","author":"Svet Ivanov","name":"Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?","datePublished":"2020-08-07T14:01:55.019Z","headline":"Haskell — функциональный язык программирования, который устроен совсем иначе, чем популярные JavaScript, PHP, Python или Java — они являются императивными или смешанными языками разработки. При этом многие адепты Haskell считают, что разработчики, использующие императивные языки, должны хотя бы попробовать научиться чистой функциональной разработке ради глубокого понимания принципов самого программирования и разницы функциональной и императивной разработки. Мы попросили Haskell-разработчиков подробно рассказать о том, как устроен этот язык программирования, о своем опыте и отличиях функционального подхода от других существующих принципов программирования.","image":"/vite/assets/blog_post-7eTyeLLt.webp","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":25}]}</script><div style="--container-size:var(--container-size-lg);margin-top:var(--mantine-spacing-xl);height:100%" class="m_7485cace mantine-Container-root" data-size="lg" data-strategy="block"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"position":1,"@type":"ListItem","item":{"@id":"/blog","name":"Блог Хекслета"}},{"position":2,"@type":"ListItem","item":{"@id":"/blog/categories/code","name":"Код"}},{"position":3,"@type":"ListItem","item":{"@id":"/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki","name":"Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?"}}]}</script><div style="margin-bottom:var(--mantine-spacing-xs)" class="m_8b3717df mantine-Breadcrumbs-root"><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/"><div style="color:inherit" class="m_4451eb3a mantine-Center-root"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-home-link "><path d="M20.085 11.085l-8.085 -8.085l-9 9h2v7a2 2 0 0 0 2 2h4.5"></path><path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 1.807 1.143"></path><path d="M20 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M20 16a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M15 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M21 16l-5 3l5 2"></path></svg></div></a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog">Блог Хекслета</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog/categories/code">Код</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root" data-size="sm">Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?</p></div><style data-mantine-styles="inline">.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}@media(min-width: 36em){.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}}</style><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root __m__-_R_eub_"><style data-mantine-styles="inline">.__m__-_R_deub_{width:100%;}@media(min-width: 36em){.__m__-_R_deub_{width:70%;}}@media(min-width: 75em){.__m__-_R_deub_{width:75%;}}</style><div class="__m__-_R_deub_"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="1">Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?</h1></div></div></div><div style="position:absolute;top:calc(18.75rem * var(--mantine-scale))" class=""></div><style data-mantine-styles="inline">.__m__-_R_2iub_{--grid-gutter:var(--mantine-spacing-xl);}</style><div class="m_410352e9 mantine-Grid-root __m__-_R_2iub_"><div class="m_dee7bd2f mantine-Grid-inner"><style data-mantine-styles="inline">.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}@media(min-width: 62em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:66.66666666666667%;--col-max-width:66.66666666666667%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_dmiub_"><div style="--stack-gap:var(--mantine-spacing-md);--stack-align:stretch;--stack-justify:flex-start;margin-bottom:var(--mantine-spacing-xl)" class="m_6d731127 mantine-Stack-root"><div class=""><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-xl)" class="m_4081bf90 mantine-Group-root"><button style="--badge-height:var(--badge-height-sm);--badge-padding-x:var(--badge-padding-x-sm);--badge-fz:var(--badge-fz-sm);--badge-bg:var(--mantine-color-default);--badge-color:var(--mantine-color-default-color);--badge-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);cursor:pointer;color:inherit" class="m_347db0ec mantine-Badge-root" data-variant="default" data-size="sm" type="button" aria-label="Без стека"><span class="m_5add502a mantine-Badge-label">Без стека</span></button></div><div style="--group-gap:calc(0.625rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-sm);color:var(--mantine-color-gray-text)" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-inline-end:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root">7 августа 2020 г.</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-clock "><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path><path d="M12 7v5l3 3"></path></svg></div>23 минуты</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div>25</div></div><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img style="--image-radius:var(--mantine-radius-md);--image-object-fit:cover;width:100%;height:100%" class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" alt="Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?"/></div></div><div role="link" tabindex="0" style="cursor:pointer"><button style="display:block;width:100%" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Присоединяйтесь к нашему Telegram-сообществу"><div style="background-color:light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6))" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:auto;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-telegram "><path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4"></path></svg></div>Присоединяйтесь к нашему Telegram-сообществу</div></div></button></div><div style="margin-bottom:var(--mantine-spacing-xl)" class="m_d08caa0 mantine-Typography-root"><p><strong>Haskell — функциональный язык программирования, который устроен совсем иначе, чем популярные JavaScript, PHP, Python или Java — они являются императивными или смешанными языками разработки. При этом многие адепты Haskell считают, что разработчики, использующие императивные языки, должны хотя бы попробовать научиться чистой функциональной разработке ради глубокого понимания принципов самого программирования и разницы функциональной и императивной разработки. Мы попросили Haskell-разработчиков подробно рассказать о том, как устроен этот язык программирования, о своем опыте и отличиях функционального подхода от других существующих принципов программирования.</strong></p>
<p>Важной особенностью Haskell является то, что он поддерживает ленивые вычисления, которые позволяют сильно ускорить работу программы и снизить нагрузку на память, а также сделать код проще и модульнее. Ленивые вычисления выполняются тогда, когда это необходимо программе, а не в том моменте, когда их указал разработчик.</p>
<p>В обычных — не ленивых или «энергичных» вычислениях — аргументы функции вычисляются перед выполнением самой функции. В языках программирования, которые применяют ленивые вычисления, этот процесс постоянно откладывается, и аргументы функции вычисляются только для реальной надобности, а не в том месте, где их указал разработчик. Например, если сейчас значение какой-то функций не нужно и оно не используется, то Haskell не будет высчитывать ее аргументы.</p>
<style data-mantine-styles="inline">.__m__-_R_7derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_7derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_7derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/java-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Java</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фундаментальные принципы программирования на Java</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png" alt="СИКП на Java" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на JS</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Навык фундаментального программирования</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png" alt="СИКП на JS" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/php-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на PHP</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Навык фундаментального понимания программ на PHP</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MywicHVyIjoiYmxvYl9pZCJ9fQ==--61c43d4881ca8feecc6f37dfafdc4e304f34b52f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png" alt="СИКП на PHP" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/ruby-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Ruby</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фундаментальные принципы программирования на Ruby </p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1NywicHVyIjoiYmxvYl9pZCJ9fQ==--bd2826bc88b4074fdf555368020c1fc0ac0705c1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png" alt="СИКП на Ruby" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/python-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Python</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите Python на глубоком уровне для решения сложных задач</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc1OCwicHVyIjoiYmxvYl9pZCJ9fQ==--023ea18f500b1c4c91617fa96bbc52df8395da39/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png" alt="СИКП на Python" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div>
<h2 id="heading-2-1">Содержание</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-2">Сферы применения Haskell</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-3">Эксперты — о необычности Haskell, его особенностях и перспективах</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-8">Дмитрий Коваников: Изучить Haskell будет полезно каждому разработчику, даже если они не планируют связывать свою карьеру с этим языком</a></li>
</ul>
<h2 id="heading-2-2">Сферы применения Haskell</h2>
<p>Haskell сейчас используется чаще всего по нескольким основным направлениям. Достаточно часто Haskell применяют в финансовом секторе — крупные банки и другие компании, работающие на этом рынке, применяют его для разработки собственных инструментов. Бизнес применяет именно Haskell из-за гарантированности точности вычислений без ошибок.</p>
<p>Haskell часто используют для написания инструментов для обработки текстов, синтаксического анализа и создания фильтр-систем для обработки спама. Структура Haskell позволяет достаточно просто заложить в него правила языка, в том числе и русского, и обучить алгоритмы находить взаимосвязи с ним.</p>
<div></div>
<p>Разработчики также применяют Haskell для создания инструментов для тестирования кода на других языках программирования. Здесь используется примерно тот же алгоритм, что и в предыдущем пункте, поскольку Haskell можно легко применять не только для анализа обычных языков, но и языков программирования.</p>
<p>При этом Haskell можно применять и для веб-разработки, он может компилироваться в JavaScript для запуска в браузере, а на сервере запускаться в качестве быстрого машинного кода, который легко обрабатывает десятки тысяч одновременных подключений.</p>
<h2 id="heading-2-3">Эксперты — о необычности Haskell, его особенностях и перспективах</h2>
<p>Мы попросили экспертов, которые работают с Haskell, рассказать об особенностях этого языка и о том, почему он развивает программистов.</p>
<h3 id="heading-3-4">Александр Гранин: Haskell, безусловно, помогает разработчику выйти на новый уровень</h3>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://i.imgur.com/RMz7I24.png" alt="Александр Гранин" loading="lazy"/></p>
<p><strong>Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?</strong></p>
<p>Моим первым языком был Basic, потом Pascal, а первым профессиональным языком был C++, за ним — C# и Python. Haskell я начал изучать 10 лет назад в качестве хобби, и инвестировал в него очень много времени. Профессионально я пишу на Haskell более трех лет. Ещё я пишу на PureScript — это язык, очень похожий на Haskell, но компилирующийся в JavaScript. И я даже написал фундаментальную книгу о том, как создавать реальные приложения на Haskell — <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://leanpub.com/functional-design-and-architecture" rel="noopener noreferrer" target="_blank">Functional Design and Architecture</a>.</p>
<p>Любопытно, что изучать Haskell как первый язык можно, и это будет даже легче, чем изучать его после 5-10 лет опыта в C++, Java, PHP, C#, Python, JavaScript и других мейнстримных языках. Это связано с тем, что мейнстримные языки исповедуют, в основном, императивную и объектно-ориентированную парадигмы. Долгое их использование ведет к образованию ментальных рельс, и опытному разработчику становится трудно с них соскочить и понять функциональную парадигму.</p>
<p>Обратный эффект, вероятно, тоже есть: когда сначала изучаешь ФП, долго на нем пишешь, а потом традиционное ООП кажется очень неудобным и сложным. Но обратный эффект зафиксировать сложнее, так как не очень много людей начинали с Haskell или другого функционального языка.</p>
<p>Есть смысл в том, чтобы изучать Haskell в качестве первого языка. Это будет чуть-чуть сложнее, чем Python или Pascal, но не намного. На начальном уровне Haskell — довольно простой язык. Проблемы с его изучением возникают из-за его необычности, так как его синтаксис и набор базовых концепций стоит сильно в стороне от привычных Си-подобных языков. Haskell могут понять все. Однако его более продвинутое использование, конечно, требует значительной подготовки. Но я все-таки считаю, что нет ни одного языка, сложнее С++, — на всех уровнях (базовый/средний/продвинутый). А С++ повсеместно учат и повсеместно используют.</p>
<p>В качестве первого языка я бы все же посоветовал Python, но ни в коем случае на нем не останавливаться. Pascal — тоже вариант, Golang и даже Rust! На самом деле, с какого бы языка вы ни начинали, вы должны понимать, что на этом этапе важнее всего умение понять задачу, декомпозировать её на простые подзадачи, вплоть до мельчайших частей, составить алгоритм, его запрограммировать и отладить.</p>
<p>С первым языком программирования вы должны изучать программирование как таковое, потому что навык составлять инструкции для компьютера — основополагающий. Без него дальнейшее продвижение в разработке невозможно. А какой там будет язык — это уже дело десятое, можно выбирать что-то себе по душе. И конечно же, через какое-то время нужно учить другие языки программирования. Лучше всего — из разных парадигм, тогда у вас будет наиболее полное представление о разработке, и как таковые языки перестанут быть загадочными. Вы сможете взять любой и разобраться в нем за считанные часы. Так что имеет смысл учить по одному или нескольким языкам из следующих категорий:</p>
<ul>
<li>системные языки (Си, Rust, Assembler)</li>
<li>низкоуровневые статически типизированные языки с ручным управлением памятью (С++, Rust)</li>
<li>высокоуровневые языки с управляемой (managed) памятью и статической типизацией (C#, Java, Scala, Kotlin, Haskell, Go)</li>
<li>динамические языки (Python, JavaScript, PHP, Clojure, Ruby, Erlang)</li>
<li>императивные языки (Си, С++, Rust, Go)</li>
<li>объектно-ориентированные языки (Java, C#, Ruby, C++, JavaScript, PHP)</li>
<li>функциональные языки (Haskell, Scala, Clojure, Erlang)</li>
<li>логические языки (Prolog)</li>
</ul>
<p>Учить, конечно, не за один присест, но постоянно, методично и планомерно.</p>
<p><strong>Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?</strong></p>
<p>Haskell, безусловно, помогает разработчику выйти на новый уровень. И дело не только в функциональной парадигме. И даже не в том, какие новые языковые конструкции предлагает Haskell (например, алгебраические типы данных и паттерн-матчинг — то, чего так не хватает в других языках). Дело в том, как программист начинает структурировать код. Если программист пишет код-лапшу, не отделяет чистые функции от нечистых, не стремится к тестируемости кода, и в принципе пишет «грязный» (<a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.ozon.ru/context/detail/id/5011068/" rel="noopener noreferrer" target="_blank">по Роберту Мартину</a>) код, то функциональное программирование ему будет даваться тяжело. Такой код не композируется, плохо управляется, и, в целом, противопоказан в функциональных языках.</p>
<p>На самом деле, практики чистого кода важны во всех языках, во всех парадигмах, и must-follow всеми профессиональными разработчиками. Но функциональные языки, в частности Haskell, предъявляют больше требований. Так например, в Haskell деление на чистые и нечистые функции вшито в сам язык. Там всё еще можно «хачить» код и не задумываться, но функциональная природа Haskell будет этому сопротивляться. Кстати — это частая причина того, что Haskell не заходит разработчикам. Код в стиле «поток сознания» будет работать очень плохо, если его вообще удастся написать. А традиционные языки никак такому стилю не препятствуют.</p>
<p>Программисты на JavaScript могут гордиться: их язык, а также Scala, затащили функциональное программирование в мейнстрим. JS — весьма функциональный язык, хотя конечно, там присутствуют и другие парадигмы. Но изучать Haskell полезно вообще всем профессиональным разработчикам. Тому есть несколько причин.</p>
<ul>
<li>
<p>Haskell — это «идиоматичное функциональное программирование». Это эталон функционального программирования со статическими типами. И он же — источник огромного количества идей и приемов, которые перенимают другие языки. Так, многие фреймворки в JS имеют функциональные черты, а еще есть популярные библиотеки (ramda) для ФП. C++ как язык в последние годы развивается в сторону функционального программирования. В нем, например, появилась библиотека ranges, предлагающая чисто функциональные инструменты обработки коллекций. И, на самом деле, аналогичные вещи уже были в C# (Linq) и Java (streams). Всё это порождения функциональной парадигмы, напрямую заимствующие из Haskell подходы и идеи. Я это утверждаю вполне серьезно, потому что общался с авторами этих подходов, и они не скрывают источника вдохновения — Haskell. Для всех мейнстримных языков есть даже доклады, показывающие, как концепции из Haskell заимствуются и перетекают в другие экосистемы. Я и сам сделал 7 (семь) докладов о функциональном С++. И можно сделать еще столько же, — так много всего функционального происходит в modern C++. Поэтому изучение Haskell дает очень много подсказок о том, как писать на других языках.</p>
</li>
<li>
<p>Haskell дает разработчику очень много новых инструментов: иммутабельность, чистые функции, монады, алгебраические типы данных, pattern-matching, стройная система типов, отличный вывод типов, функционально-декларативный стиль кода. Это всё то, чего очень не хватает в мейнстримных языках. Сейчас многие концепции туда перетекают, так как они доказали свою полезность. Если разработчик претендует на роль старшего, лида или архитектора, его инструментарий должен быть как можно шире. И современный мир накладывает такое требование: нужно знать и ООП, и ФП. А ФП лучше всего изучить в его самом правильном проявлении — Haskell.</p>
</li>
<li>
<p>Haskell очень расширяет сознание. Писать на нем — очень приятно. Ни один другой язык не может предоставить такой уровень уверенности в коде. Разработчик чувствует, что написанный и скомпилированный код на Haskell будет надежен, и даже со временем не потеряет этой надежности. Такого уровня гарантий ни один другой язык предоставить не может. Например, код на С++ легко может взорваться на каждом шагу, и часто — непонятно почему. Undefined behavior поджидает за каждым углом, ничему нельзя доверять, ни на какую часть кода нельзя полагаться. Это очень неприятно, и крайне осложняет разработку. Изучать Haskell нужно уже хотя бы потому, что он показывает, какое приятное может быть программирование.</p>
</li>
</ul>
<p><strong>Какие есть особенности у Haskell? Какие очевидные плюсы и минусы есть у этого языка?</strong></p>
<p>Главная особенность языка заключается в том, что Haskell предлагает совершенно иной взгляд на то, как писать программы. Сейчас уже неоспоримо, что функциональное программирование — это следующая большая парадигма после объектно-ориентированного, и что тренд будет только усиливаться. А значит, есть возможность запрыгнуть на этот поезд и оказаться в числе первых. Функциональное программирование — это не просто модное направление, это способ решать те же задачи более удобным, лаконичным и понятным способом. А еще решать новые задачи, которые было сложно решить на традиционных языках.</p>
<p>Очевидные плюсы Haskell как такового — это разделение на чистый и нечистый слои на уровне языка (монада IO), иммутабельность, полезные монады (Maybe, Either, List), алгебраические типы данных, богатый набор примитивов для конкурентного программирования (Software Transactional Memory, MVar). При этом с использованием продвинутой системы типов можно следовать подходу “make invalid state irrepresentable” (то есть, невалидные состояния программы запрограммировать просто нельзя). Haskell — это очень консистентный язык, из-за этого у вас появляется понимание, что в других языках сделано правильно, а что не очень, повышается осознанность их использования.</p>
<p>Концепции из Haskell тоже очень полезны, а если вы пишете многопоточный код, то Haskell предлагает целый клондайк подходов и идей, помогающих бороться со сложностью и повышать надежность программ. Еще одна хорошая сторона — большое количество учебных материалов по Haskell: написаны разные книги, статьи, туториалы, есть видеокурсы и упражнения. И всегда есть у кого попросить помощи. В Haskell есть свои системы сборки и свои пакетные менеджеры (stack и cabal), и они работают замечательно, да и компилятор GHC генерирует оптимизированный, сравнительно быстрый код (не хуже Java c JVM).</p>
<p>Минусы у Haskell, конечно, есть. Сложность верхнеуровневых type-level концепций, неудовлетворительная работа с рекордами, подводные камни его ленивой природы. Есть проблемы и с экосистемой, и они, пожалуй, более существенны. Развитие единственного компилятора — GHC — происходит неравномерно, иногда с потерей обратной совместимости. Документация на библиотеки часто плохая, и сами библиотеки оставляют желать лучшего. Для большинства типичных задач библиотеки есть, но решение нестандартных задач будет затруднено. Практики и подходы разработки больших приложений только установились, но еще предстоит пройти большой путь.</p>
<p>Кроссфплатформенность — еще одна проблема. Haskell замечательно работает под Linux и MacOS, а с Windows есть некоторые проблемы. К сожалению, направление Windows не в приоритете у разработчиков GHC. Наконец, — и для кого-то это очень важно, — для Haskell нет хороших IDE. Предпринимались разные попытки их создать, но пока что можно рассчитывать только на элементарную подсветку синтаксиса и наивное автодополнение по словарю. Более продвинутые фичи (навигация и рефакторинг) в разных плагинах либо забагованные, либо не справляются с разумно большими проектами.</p>
<p><strong>В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?</strong></p>
<p>К сожалению, этот миф очень мешает. Haskell видят как академический язык, а между тем он очень практичен, и он готов к production. Хаскеллисты тоже не все академики, и даже не все знают глубокую математику. Это и правда миф. Не нужно знать ни Теорию Категорий, ни Лямбда-Исчисление, ни другую продвинутую математику, чтобы писать на Haskell полезные программы. В сообществе есть люди, которые занимаются очень умными вещами на границе Computer Science, и им математика нужна. Но также есть и другие люди, которые успешно разрабатывают коммерческие продукты на Haskell без потребности в глубоких математических концепциях.</p>
<blockquote>
<h3 id="heading-3-5">Читайте также:</h3>
<p>DevOps — что это такое и почему эти практики меняют мир разработки <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/devops-chto-eto-takoe-i-pochemu-eti-praktiki-menyayut-mir-razrabotki-uzhe-seychas" rel="noopener noreferrer" target="_blank">уже сейчас</a></p>
</blockquote>
<p>Например, я изучаю Haskell десять лет, и пишу на нем профессионально более трех, но не математик, и ничего кроме остаточных знаний от университетской программы у меня в голове нет. Тем не менее, я вполне успешен. Даже более успешен, чем с языками C++, C# и Python.</p>
<p>Как индустриальный инструмент, Haskell хорошо зарекомендовал себя во многих областях: распределенные, многопоточные и конкурентные приложения, финансовые приложения, компиляторы, инструменты обработки данных, веб-бэкенды и десктопные приложения. Об этом можно почитать статью Гонзалеса “<a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://github.com/Gabriel439/post-rfc/blob/master/sotu.md" rel="noopener noreferrer" target="_blank">State of the Haskell ecosystem</a>”.</p>
<p>А вот фреймворки — это интересная тема. Долгое время в сообществе отрицалась необходимость фреймворков. Это было время, когда практики и подходы промышленной разработки на Haskell даже не начали оформляться. Но в последние годы всё изменилось, и я тоже приложил к этому значительные усилия. Сейчас в Haskell есть ряд фреймворков и архитектурных библиотек, которые набирают популярность. Возможно, я автор наибольшего числа фреймворков во всем мировом Haskell-сообществе, потому что я их сделал более четырех.</p>
<ul>
<li>Hydra — полноценный фреймворк для создания web-бэкендов, многопоточных и конкурентных приложений. Позволяет работать с SQL DB, с KV DB, поддерживает логгирование, процессы, подсистему для взаимодействия с консолью. Hydra — это даже не один, а целых три фреймворка, основанных на разных движках, чтобы было можно сравнивать между собой разные подходы и дизайн. Hydra — преимущественно демонстрационный проект, который я использую для своей книги, но эти же идеи легли в основу коммерческих фреймворков, которые я создал для разных компаний.</li>
<li>Node — фреймворк для создания распределенных приложений. В его основе лежит та же самая методология, на которой базируются все мои фреймворки.</li>
<li>PureScript Presto — фреймворк для написания мобильных приложений. Это другой язык, PureScript, но он очень похож на Haskell, и является его идейным продолжателем. PureScript компилируется в JavaScript, и его главная платформа — это web.</li>
<li>PureScript Presto.Backend — фреймворк для web-бэкендов, который унаследовал дизайн у PureScript Presto. Оба фреймворка активно используются в индийской финансовой компании Juspay и являются ее ключевыми технологиями. На них построено очень популярное мобильное приложение для денежных переводов, а также платежный сервис и бэкенд.</li>
</ul>
<p>Эти фреймворки доступны в Open Source, но есть еще два коммерческих фреймворка, оба в компании Juspay, которые я для них создал, но они ещё не опубликованы.</p>
<p>Что касается других фреймворков, то у нас есть:</p>
<ul>
<li>Yesod — web framework;</li>
<li>Snap — web framework & HTTP server;</li>
<li>Servant — HTTP server;</li>
<li>IHP: Integrated Haskell Platform — фреймворк для сервер-сайд рендеринга;</li>
<li>...и другие, частичный список которых можно найти <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://wiki.haskell.org/Web/Frameworks" rel="noopener noreferrer" target="_blank">здесь</a>.</li>
</ul>
<p><strong>Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?</strong></p>
<p>Вакансий на Haskell сейчас не очень много. Доля рынка у этого языка очень маленькая. И хотя она растет, и появляются новые компании, делающие на него ставку, все равно их на два-три порядка меньше, чем у самых популярных языков. Тем не менее, становится проще отслеживать вакансии, проще взаимодействовать с работодателями. У нас есть ряд ресурсов, где постятся предложения: <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.reddit.com/r/haskell" rel="noopener noreferrer" target="_blank">Reddit</a>, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://t.me/haskell_job" rel="noopener noreferrer" target="_blank">чат в Телеграме</a>, тематические чаты. Эти вакансии не постятся на HeadHunter и подобных сервисах, потому что более выгодно прийти в сообщество и обратиться к нему напрямую. Но надо сказать, что есть некоторое превышение спроса над предложением. Хаскеллистов требуется больше, чем их есть, особенно таких, которые умеют решать задачи бизнеса. Возможно, для старта карьеры Haskell подходит не очень, но если вы обрели почву под ногами в других экосистемах, то Haskell может стать очень приятным продолжением.</p>
<p><strong>Будет ли Haskell востребован в будущем?</strong></p>
<p>Есть опасения, что Haskell может перестать привлекать даже то внимание, которое привлекает сейчас. Риск связан с тем, что традиционные языки надежно удерживают лидерские позиции, и приходят новые языки, перенимающие из Haskell все самое лучшее. Такой, например, Rust. Стартовав совсем недавно, он обгонит Haskell по популярности, и есть очень большой смысл инвестировать в Rust, пока это еще не стало мейнстримом.</p>
<p>В то же время, ближайшие пять лет Haskell всё еще будет присутствовать на рынке, потому что есть ряд компаний, где он зарекомендовал себя очень хорошо. Не могу сказать, что его будущее безоблачно, но выражаю осторожный оптимизм. Потому что я сам прикладываю большое количество усилий, чтобы популярность Haskell в индустрии росла, чтобы он всегда оставался с нами и продолжал приносить пользу и радость.</p>
<h3 id="heading-3-6">Владислав Завьялов: Haskell позволяет понять программирование глубже, ведь именно через него можно освоить концепции функционального программирования</h3>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://i.imgur.com/bXYEizB.png" alt="Владислав Завьялов" loading="lazy"/></p>
<p><strong>Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?</strong></p>
<p>Первым языком я изучал BASIC. Потом были Pascal, C++, C#, Python. Опыт с этими языками у меня был поверхностный, но достаточный, чтобы начать задаваться вопросом: неужели нельзя сделать язык получше? Мне хотелось помощи от компилятора в написании корректного кода. Статическая проверка типов, автоматическое управление памятью, неизменяемые данные. В итоге мне посоветовали попробовать Haskell. С первых строк <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://learnyouahaskell.com/introduction" rel="noopener noreferrer" target="_blank">книги</a> о нем я понял, что нашел язык для себя: чистые функции, ленивые вычисления, статическая типизация.</p>
<p>Если бы я начал с Haskell как первого языка, то не смог бы оценить его по достоинству. Только после опыта борьбы с сегфолтами, рантайм-ошибками, и неконсистентным изменяемым состоянием, функциональное программирование представилось глотком свежего воздуха. Когда я стал искать первую оплачиваемую работу, то наверняка знал только одно: это должна быть разработка на Haskell. Так что весь мой опыт коммерческой разработки именно на Haskell.</p>
<p>У каждого человека, так или иначе, будет свой путь в программировании, и Haskell — это такая же неплохая отправная точка, как любая другая. Так что если кто-то хочет изучать Haskell как первый язык, я это только поддерживаю.</p>
<p><strong>Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?</strong></p>
<p>Безусловно, Haskell позволяет понять программирование глубже, ведь именно через него можно освоить концепции функционального программирования. Но это действует и в обратную сторону: программисту на Haskell полезно изучить JavaScript и написать на нем что-то нетривиальное.</p>
<p>В целом, полезно осваивать языки, максимально непохожие друг на друга, представляющие разные парадигмы. Только увидев и ощутив совершенно разные подходы к решению задач можно осознать, где фундаментальная сложность задачи, а где недостатки того или иного инструмента.</p>
<p>Я написал про это <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://serokell.io/blog/10-reasons-to-use-haskell" rel="noopener noreferrer" target="_blank">статью</a>: десять причин использовать Haskell. В ней я называю следующие особенности Haskell:</p>
<ul>
<li>Безопасное управление памятью, сборка мусора</li>
<li>Компиляция в нативный код</li>
<li>Статическая типизация, развитая система типов</li>
<li>Чистые функции</li>
<li>Ленивые вычисления</li>
<li>Многопоточное программирование</li>
<li>Метапрограммирование (генерация кода)</li>
</ul>
<p>Некоторые из этих особенностей — например, сборка мусора, есть и у более популярных языков. Некоторые из них, такие как ленивые вычисления, больше практически нигде не встречаются. Но именно их совокупность делает Haskell хорошим языком для разработки библиотек и приложений.</p>
<p>Из минусов: есть случаи, когда Haskell не подходит. Например, для фронтэнда веб-приложений лучше выбрать язык, который дает на выход компактный и быстрый JavaScript. При этом для вычислений в реальном времени, паузы на сборку мусора могут быть неприемлемы. Но в большинстве случаев Haskell подходит хорошо.</p>
<p><strong>В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?</strong></p>
<p>Конечно, можно на Haskell реализовать решатель системы линейных уравнений и неравенств. Думаю, все согласятся — это математика. Но это же делается для какой-то цели, а не просто так. Например, в Cassowary (<a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://t.co/GIvvM6hgHu?amp=1" rel="noopener noreferrer" target="_blank">https://overconstrained.io</a>) такие системы неравенств предлагается решать в графических интерфейсах пользователя, чтобы расположить элементы интерфейса на плоскости экрана. И там есть много реализаций на разных языках, на том же JavaScript их больше пяти, а на Haskell только одна. То есть выходит, что это JavaScript язык для математики? Или что Haskell это язык для графических интерфейсов пользователя?</p>
<p>Язык программирования – это формальная система для того, чтобы излагать инструкции для компьютера, а математика может как изучать формальные системы, в том числе языки программирования, так и подсказать, что в этих формальных системах следует выразить, чтобы решить какие-то прикладные задачи. Сама по себе математика задачей не является, а поэтому языка программирования для нее быть не может.</p>
<p>Haskell может применяться для всех тех же задач, что и другие языки, такие как Python, C#, Java, в том числе для написания бэкндов веб-приложений, прикладных программ с графическим интерфейсом или интерфейсом командной строки, системных утилит, компиляторов, систем анализа и обработки данных, и чего угодно еще. Из фреймворков, хочу отметить <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://hackage.haskell.org/package/servant%5D" rel="noopener noreferrer" target="_blank">Servant</a>. Это отличный способ написать веб-сервис на Haskell.</p>
<p><strong>Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?</strong></p>
<p>Периодически я вижу, как ищут Haskell-разработчиков. Но конкуренция за эти места достаточно сильная: Haskell приходится по нраву многим разработчикам, и на вакансии быстро находятся желающие. Поэтому надо готовиться к тому, что ожидания у работодателя будут высокими.</p>
<p><strong>Будет ли Haskell востребован в будущем?</strong></p>
<p>Посмотрим! Язык продолжает развиваться, с каждой версией компилятора добавляется что-то новое и интересное. Мне видится, что Haskell набирает обороты.</p>
<h3 id="heading-3-7">Алексей Пирогов: На Haskell пишут значительно более разнообразное ПО, чем на том же PHP</h3>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://i.imgur.com/3zwSr8J.png" alt="Алексей Пирогов" loading="lazy"/></p>
<p><strong>Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?</strong></p>
<p>Я изучал Haskell, уже будучи профессиональным программистом. При этом смысл изучать Haskell в качестве первого языка действительно есть — можно научиться ФП до того, как голова окажется забита всякой «процедурщиной».</p>
<p><strong>Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?</strong></p>
<p>Haskell позволит по-настоящему пощупать функциональное программирование в естественной для него среде, а не в качестве пристройки к процедурному языку. При этом элементы функционального программирования есть и в PHP или JavaScript, но погружение в функциональную среду позволит применять эти элементы правильно и к месту.</p>
<p>Статический анализ кода и проверка типов сегодня используются в том числе и применительно к изначально динамически типизированным языкам — даже к языкам со слабой динамической типизацией, таким как JavaScript или PHP. Haskell же не только статически типизирован, статическая типизация в Haskell — сильная. А это сам по себе сильный «сдвиг парадигмы». Но и кроме смены вида типизации, меняется сам подход к проектированию: вы пишете код от типов — Type-Driven Development. Более того, часто компилятор пишет код за вас — опираясь на описанные вами типы. Это не только интересно, но и практично.</p>
<p><strong>В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?</strong></p>
<p>На Haskell пишут значительно более разнообразное ПО, чем на том же PHP. Тут вам и высокоскоростной трейдинг (HFT) и сворачивание белков, и синтез электронных схем, вычисления на GPU. Например, в Facebook на Haskell написана подсистема фильтрации спама: на специальном мини-языке (DSL) пишутся правила фильтрации, а потом весь набор правил компилируется в высокоэффективный машинный код — это ещё одно отличие от интерпретируемых JS и PHP.</p>
<p>Haskell — язык общего назначения, подходит он для многого. Можно и Web писать: Haskell компилируется в JavaScript для запуска в браузере, а на сервере запускается быстрый машинный код, легко обрабатывающий десятки тысяч одновременных подключений. Имеются даже фреймворки для некоторых областей: для Web это Servant, Scotty, в других же не принято использовать фреймворки вообще: в ФП принято композировать функции, и фреймворк не нужен, когда функций достаточно и они хорошо композируются.</p>
<p><strong>Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?</strong></p>
<p>Работа есть. Если хочется full-time писать на Haskell, то вы всегда найдёте, где это можно делать. Да, язык — не мейнстримовый, но сказать, что на нём никто не пишет, нельзя. Про сочетания с инструментами сказать сложно: опять же всему виной разнообразие задач, которые решаются на Haskell. В Web используют СУБД, такие как PostgreSQL, frontend-серверы — по типу Nginx.</p>
<p><strong>Будет ли Haskell востребован в будущем?</strong></p>
<p>Интерес к ФП в целом — растёт, и сам по себе Haskell активно развивается. OpenSource библиотеки покрывают все большее количество областей. И работы тоже становится больше, в том числе и в наукоёмких областях — ML, компьютерное зрение, квантовые вычисления, биоинформатика. Так что, да, я считаю, язык Haskell будет востребован в будущем.</p>
<h2 id="heading-2-8">Дмитрий Коваников: Изучить Haskell будет полезно каждому разработчику, даже если они не планируют связывать свою карьеру с этим языком</h2>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://i.imgur.com/JG4voXt.png" alt="Дмитрий Коваников" loading="lazy"/></p>
<p><strong>Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?</strong></p>
<p>До знакомства с Haskell я несколько лет уже программировал на Java, Kotlin и C++, поэтому Haskell не был моим первым языком программирования, но он был первым функциональным языком, который я использовал. По своему опыту преподавания Haskell я могу сказать, что он вполне подходит и в качестве первого языка. Сам Haskell вполне самодостаточен и не содержит в себе принципы, требующие изучения других языков заранее.</p>
<p><strong>Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?</strong></p>
<p>Полностью согласен с этим утверждением. Я считаю, что изучить Haskell будет полезно каждому разработчику, даже если они не планируют связывать свою карьеру с этим языком. Haskell содержит уникальный набор фич: ленивость, чистота и иммутабельность по умолчанию, функции высших порядков, паттерн-мэтчинг, алгебраические типы данных, тайпклассы, и т. д. Почти каждую из этих фич можно найти в каком-то другом мейнстримовом языке, но именно такое их сочетание приводит к особенному стилю программирования. Те вещи, которые в других языках считаются лучшими практиками или паттернами программирования, в Haskell выражаются естественным образом. Когда пытаешься решать реальные задачи в таком стиле, и когда язык заставляет тебя постоянно думать и писать в таком стиле, то начинаешь и на других языках видеть способы применения этих техник для написания более корректного и поддерживаемого кода.</p>
<blockquote>
<h3 id="heading-3-9">Читайте также:</h3>
<p>Как устроен функциональный диалект Лиспа Clojure и почему использующие его программисты <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/clojure" rel="noopener noreferrer" target="_blank">восхищаются им</a></p>
</blockquote>
<p>С точки зрения профессионального роста, Haskell помогает лучше понять и применить следующие подходы:</p>
<ul>
<li>Декомпозиция бизнес логики на более маленькие и независимые части, которые затем можно легко объединять и комбинировать.</li>
<li>Выражение состояний программы и различной логики через типы данных.</li>
<li>Использование алгебраических абстракций для описания высокоуровневого интерфейса.</li>
<li>Многопоточное программирование через более удобные примитивы.</li>
</ul>
<p>Например, разделение бизнес логики на чистые функции по валидации данных и функции с сайд-эффектами по работе с БД полезно и в PHP, и в Java, но именно в Haskell компилятор заставляет писать в таком стиле. Можно считать, что компилятор Haskell, как внимательный ментор, не даст написать код, в котором легко ошибиться. И именно поэтому он заставляет прокачаться — чтобы написать работающий код, необходимо выполнить все правила компилятора и структурировать код в естественном для языка стиле.</p>
<p>Основной особенностью Haskell является то, что он заставляет думать и программировать в декларативном стиле. Вместе того, чтобы шаг за шагом описывать, что делать с текущими переменными, приходится думать о том, как трансформировать одни данные в другие, какие комбинаторы для этого использовать и как структурировать код. Я бы сказал, что после многих лет программирования на императивных языках, программирование на Haskell может очень сильно освежить. Рекомендую всем, кто в поиске новых челленджей и изучения нового.</p>
<p>Из положительных сторон Haskell:</p>
<ul>
<li>Самый большой плюс — создание легко-поддерживаемого кода. Компилятор является очень большим помощником! Гниение кода очень легко избежать, и даже если не трогать проект 2 года, можно вернуться к нему, и он по-прежнему будет работать. Более того, его легко можно будет обновить.</li>
<li>Очень легко рефакторить код, и, более того, есть уверенность в том, что рефакторинг не сломает бизнес-логику. Любое легаси можно перевести на современные подходы без необходимости переписывать проект заново.</li>
<li>Изначально получается написать более корректный код в среднем, так как язык по дизайну помогает избежать большого класса ошибок в программах.</li>
<li>Haskell постоянно развивается и пополняется фичами, недоступными в других языках, так как обычно ресёрч в области PL происходит на Haskell. Исследователи находят очень привлекательным тот факт, что языком пользуется много людей для решения практических проблем, поэтому стараются придумывать более полезные фичи, которые позволят решать задачи более эффективно.</li>
<li>Удобные примитивы для написания многопоточного кода: Software Transactional Memory, библиотека async, и т. п.</li>
<li>Эффективная рантайм система: легковесные потоки, два вида сборщика мусора для различных юзкейсов, множество способов профилировать и анализировать рантайм статистику, и т. п.</li>
<li>Не у всех проблем есть установленные решения, поэтому люди всегда экспериментируют с новыми подходами и пытаются искать более удобные и эффективные способы решения существующих проблем.</li>
<li>Меньше церемоний: бизнес-логика более явно видна в приложении, а не прячется за слоями деталей реализации, очень много инструментов избавления от бойлерплейта, сам язык довольно лаконичный и элегантный, идеи из головы более прямо и быстро транслируются в рабочий код.</li>
</ul>
<p>Но и минусы есть, а именно:</p>
<ul>
<li>Haskell — один из немногих языков, которым одновременно активно пользуются и люди для теоретических исследований в области PL, и промышленные программисты. Поэтому, например, не всегда можно найти библиотеку с API какого-нибудь сервиса. Или, если у автора библиотеки более академическая наклонность, то документация будет использовать более научные термины. В то время как мейнстримовые языки создавались целенаправленно для решения проблем из продакшна, Haskell пользовался большей популярность у академиков. Это преимущество с одной стороны, так как в основах стандартных библиотек и фреймворков лежат более фундаментальные абстракции. Но с другой стороны, у некоторых практических проблем только непрямые пути эффективного их решения.</li>
<li>Время комп��ляции проектов бывает очень долгим, особенно когда используешь продвинутые фичи языка.</li>
<li>Сообщество языка немного раздроблено: соревнующиеся билд-тулы, веб-фреймворки, и т. п. Иногда это затормаживает развитие и улучшение библиотек, так как для интеграции со всеми инструментами приходится использовать только фичи, которые поддерживают все.</li>
</ul>
<p>В целом, я считаю, что сейчас плюсы перевешивают минусы, и многие минусы решатся со временем. Они не являются какими-то фундаментальными ограничениями языка, просто требуется больше времени и людей, чтобы всё улучшить.</p>
<p><strong>В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?</strong></p>
<p>Я абсолютно не согласен с утверждением, что Haskell — язык для математики. Я на Haskell пишу бэкенд веб-сервисов, CLI тулы, библиотеки декондинга, логирования, БД.</p>
<p>В бэкенде типичного веб-приложения можно встретить следующие библиотеки:</p>
<ul>
<li>servant — веб-фреймворк для описания REST API</li>
<li>postgresql-simple — библиотека для общения с PostgreL</li>
<li>co-log — библиотека логирования</li>
<li>aeson — парсинг JSON объектов</li>
<li>bcrypt — хеширование паролей</li>
<li>ekg — мониторинг запущенного сервера</li>
<li>blaze-html — eDSL для генерации HTML</li>
<li>hspec и hedgehog — фреймворки для юнит- и проперти-тестирования</li>
<li>proto-lens — генерация Haskell типов данных из protobuf сообщений</li>
<li>и очень много других библиотек для решения типичных проблем</li>
</ul>
<p>Так как в Haskell есть сборщик мусора, то язык не подходит для написания проектов, где требуется больший контроль над управлением памяти. В таких областях лучше выбрать Rust, C++, C. Но везде, где можно использовать Java, PHP, Ruby, Scala, Go, можно так же использовать и Haskell: бекенд веб-приложений, сервисы, CLI тулы, IDE, компиляторы, анализаторы кода — тут Haskell особенно хорошо подходит.</p>
<p><strong>Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?</strong></p>
<p>На программистов со знанием Haskell есть спрос. В еженедельной рассылке Haskell Weekly каждый раз бывают вакансии от компаний, которые ищут Haskell-разработчиков. Особенно популярен Haskell у стартапов, так как им не нужно интегрироваться с существующими системами и есть возможность использовать продуктивные инструменты.</p>
<p>Обычно компании, которые используют Haskell, склоняются в сторону функциональных языков (и инструментов в общем), поэтому помимо знания Haskell в требования можно встретить SQL, Elm/PureScript, Nix, Rust.</p>
<p><strong>Будет ли Haskell востребован в будущем?</strong></p>
<p>Однозначно будет. Язык продолжает развиваться и улучшаться, каждые полгода выходит новая версия компилятора с новыми фичами, улучшениями перформанса и багфиксами. Всё больше и больше компаний используют Haskell, а ресёрч в области PL не прекращает развиваться.</p>
<h3 id="heading-3-10">Денис Москвин: Будущее, в котором Haskell востребован, выглядит гораздо более упорядоченным и разумным</h3>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://i.imgur.com/rmogP6D.png" alt="Денис Москвин" loading="lazy"/></p>
<p><strong>Какой у вас был первый язык программирования? Есть ли смысл изучать Haskell в качестве первого языка?</strong></p>
<p>Когда я изучал свои первые языки, Haskell еще не было. Это 80-е годы прошлого века, тогда в СССР были более-менее широко доступны Fortran, Basic, Pascal и C. Функциональными языками если кто-то и занимался, то очень локально, я про них ничего тогда не слышал. Впрочем, я по образованию физик, поэтому нам языки программирования преподавали главным образом в контексте научных расчетов.</p>
<p>Haskell в качестве первого языка можно было бы попробовать преподавать, но, если речь о детях 11-13 лет, то нужно очень аккуратно продумать методику. В целом я даже не очень понимаю, как оценить успешность подобного эксперимента. Очевидно, что если это будет делать энтузиаст Haskell с хорошими педагогическими скиллами, то результат будет довольно приличный. Но насколько это масштабируется в более-менее массовое образование — непонятно.</p>
<p><strong>Есть мнение, что изучение Haskell помогает разработчику выйти на новый уровень, глубже понять программирование. Вы согласны с этим утверждением? Программисту, который работает с PHP или JavaScript, полезно освоить Haskell с точки зрения профессионального роста? Как именно Haskell помогает прокачаться, за счёт чего это происходит?</strong></p>
<p>Haskell — чисто функциональный типизированный язык с нестрогой (ленивой) моделью исполнения. Функциональное программирование в целом, и Haskell, как один из наиболее чистых представителей этой парадигмы, позволяет программисту освоить новый, нетрадиционный подход к написанию программ. В императивных языках программа — это последовательность инструкций, в функциональных программа — это выражение. Это довольно сильное отличие, не только в синтаксисе, но и в модели исполнения. Например, все структуры данных иммутабельны, то есть не изменяются после создания. Благодаря этому свойству, мы получаем большой набор гарантий относительно поведения программ. Более того, эти гарантии известны не только нам, но и компилятору, что позволяет ему выполнять довольно высокоуровневые оптимизации.</p>
<p>Выражениям, в отличие от инструкций, легче приписывать типы. Поэтому в Haskell очень богатая и стройная система типов, при этом программисту почти не требуется указывать типы вручную — подсистема вывода типов делает это за него.</p>
<p>Ленивая модель вычислений позволят не вычислять те подвыражения большого выражения, которые не нужны для получения конечного результата, Это дает, например, возможность описывать потенциально бесконечные структуры данных, например, список всех нечетных натуральных чисел [1,3..]. И работать с ними так же как с обычными конечными структурами.</p>
<p>При этом все стандартные практики и идеи из функциональных языков можно напрямую использовать в традиционных императивных. Тем не менее, представление о таких практиках и понимание того, как все это работает, безусловно делает программиста более компетентным. Haskell, как чисто функциональный язык, позволяет познакомиться с подобными практиками в «дистилированном» виде, в отличие от «смешанных» языков, вроде Scala или Closure.</p>
<p><strong>В сообществе разработчиков есть миф, что Haskell — в основном язык для математики. Какие инструменты или фреймворки языка вы используете? Какие проекты лучше всего реализовывать на Haskell?</strong></p>
<p>Профессиональные математики не особо используют языки программирования в своей повседневной работе. Они, главным образом, теоремы формулируют, доказывают и статьи про это пишут. Сам Haskell и его модель вычислений действительно базируются на хорошо проработанной математической теории. Но это плюс, а не минус: в стандарте языка почти нет темных углов и плохо совместимых свойств.</p>
<p>Что касается использования Haskell, то это язык общего назначения, на нем можно писать практически любой код. Большинство популярных прикладных библиотек портированы на Haskell и доступны на Hackage — центральном репозитории пакетов. Основные инструменты работы — компилятор Glasgow Haskell Compiler (GHC) и поставляемый с ним интерпретатор GHCi, Cabal — инструмент создания пакетов и их дистрибуции, инструменты для поиска в документации (Hoogle и Hayoo) и для её генерации (Haddoc).</p>
<p>Обычно на Haskell реализуют проекты с нетривиальными схемами обработки данных. Это связано с тем, что для стандартных схем существует огромное количество популярных и развитых фреймворков, привязанных к экосистемам конкретных языков. В коммерческой разработке Haskell довольно активно используют в финансовом анализе, в инженерном обеспечении технологий на базе блокчейна, есть несколько успешных команд, использующих его в прикладной биоинформатике.</p>
<p><strong>Есть ли спрос на программистов со знанием Haskell? В сочетании с какими языками и инструментами чаще всего работодатели ищут Haskell-разработчиков?</strong></p>
<p>Некоторый спрос есть, но он довольно нишевый.</p>
<p><strong>Будет ли Haskell востребован в будущем?</strong></p>
<p>Будущее, в котором Haskell востребован, выглядит гораздо более упорядоченным и разумным. Поэтому будем на это надеяться.</p>
<style data-mantine-styles="inline">.__m__-_R_85derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:80%;}@media(min-width: 36em){.__m__-_R_85derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_85derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/biblioteka-react-review-article"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTYyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--6bac7610f325471938a0e33f58eaa4c52527d66f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%87%D1%82%D0%BE%D1%82%D0%B0%D0%BA%D0%BE%D0%B5react-01.png" loading="lazy" alt="Библиотека React: особенности, перспективы, ситуация на рынке труда"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Библиотека React: особенности, перспективы, ситуация на рынке труда</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">В объявлениях о поиске программистов часто встречается требование уметь работать с React. Иногда ...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">29 февраля 2024 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMywicHVyIjoiYmxvYl9pZCJ9fQ==--aa69869c906a992728ba7c26886fa1b715024424/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%8F%D0%B7%D1%8B%D0%BA%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8Fjavascript-01.png" loading="lazy" alt="Язык программирования JavaScript: где его используют и почему он популярен"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Язык программирования JavaScript: где его используют и почему он популярен</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Рассказываем, что это за язык программирования — JavaScript, где его используют, насколько он поп...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">4 октября 2023 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/zachem-izuchat-node-js-ili-o-perspektivah-bekenda-na-javascript"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY4MywicHVyIjoiYmxvYl9pZCJ9fQ==--8e5dd13a34bb6d61f1c0db87a25e6e64d0e237fb/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/node%20_new-01.png" loading="lazy" alt="Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Рассказываем, как устроен бэкенд на JavaScript, стоит ли изучать Node.js, когда есть PHP и Python...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">28 июля 2023 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div></div></div></div>
<hr/>
<p>На Хекслете сейчас нет курсов изучения Haskell, однако есть отдельный курс по функциональному <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/courses/js-functions-hard-way" rel="noopener noreferrer" target="_blank">программированию</a> для JavaScript, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://youtu.be/TjDEeaohNog" rel="noopener noreferrer" target="_blank">вебинар</a> на эту тему от разработчика Никиты Соболева или <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.youtube.com/watch?v=vN3Ac0dwXdk" rel="noopener noreferrer" target="_blank">программиста</a> Александра Гранина, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.code-basics.com/languages/racket" rel="noopener noreferrer" target="_blank">бесплатный курс</a> по языку Racket и <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/courses/erlang_101" rel="noopener noreferrer" target="_blank">небольшой курс</a> по функциональному языку программирования Erlang. Кроме того, на нашем сервисе Codebattle <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://codebattle.hexlet.io/" rel="noopener noreferrer" target="_blank">есть</a> возможность выбрать Haskell и решать задачи на этом языке.</p>
<blockquote>
<h3 id="heading-3-11">Никогда не останавливайтесь:</h3>
<p>В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/courses?from=blog" rel="noopener noreferrer" target="_blank">сотни курсов по разработке на разных языках и технологиях</a></p>
</blockquote></div><div class=""><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-user "><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0"></path><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path></svg></div><p style="margin-inline-end:var(--mantine-spacing-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Svet Ivanov</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">6 лет назад</p></div><div style="align-items:center" class="m_8bffd616 mantine-Flex-root __m__-_R_5dirddmiub_"><a style="display:inline-flex" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki/votes"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div></a><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">25</p></div></div></div><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding:var(--mantine-spacing-xl)" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Читайте также:</p><ul style="margin-inline-start:var(--mantine-spacing-lg)" class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/biblioteka-react-review-article">Библиотека React: особенности, перспективы, ситуация на рынке труда</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov">Язык программирования JavaScript: где его используют и почему он популярен</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/zachem-izuchat-node-js-ili-o-perspektivah-bekenda-na-javascript">Все про Node.js: зачем писать бэкенд на JavaScript и сколько за это платят</a></span></div></li></ul></div><div style="margin-block:var(--mantine-spacing-xl)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div></div><div></div></div><style data-mantine-styles="inline">.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}@media(min-width: 62em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:33.333333333333336%;--col-max-width:33.333333333333336%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_lmiub_ mantine-visible-from-md"><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-bottom:var(--mantine-spacing-xl);padding:var(--mantine-spacing-xl);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="margin-bottom:var(--mantine-spacing-md)" class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Категории</p></div><ul class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Мотивация">Мотивация</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Истории успеха">Истории успеха</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Дневник студента">Дневник студента</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Код">Код</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Карьера">Карьера</button></span></div></li></ul></div><div style="justify-content:end;margin-top:0rem;position:sticky;top:calc(5rem * var(--mantine-scale))" class="m_8bffd616 mantine-Flex-root __m__-_R_5dlmiub_"><div tabindex="0" style="cursor:pointer"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses_java?promo_name=program_category&promo_position=blog_post&promo_creative=card&promo_type=card"><div style="background-color:var(--mantine-color-default);border:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);padding-inline:var(--mantine-spacing-xl);padding-top:var(--mantine-spacing-xl);padding-bottom:var(--mantine-spacing-xs);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Курсы по Java</p></div><img class="m_9e117634 mantine-Image-root" src="/vite/assets/development-BVihs_d5.png"/><p style="margin-bottom:var(--mantine-spacing-xs);text-align:right" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></a></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>