Haskell — язык, позволяющий глубже понять программирование. Как он устроен и почему его выбирают разработчики?
Haskell — функциональный язык программирования, который устроен совсем иначе, чем популярные JavaScript, PHP, Python или Java — они являются императивными или смешанными языками разработки. При этом многие адепты Haskell считают, что разработчики, использующие императивные языки, должны хотя бы попробовать научиться чистой функциональной разработке ради глубокого понимания принципов самого программирования и разницы функциональной и императивной разработки. Мы попросили Haskell-разработчиков подробно рассказать о том, как устроен этот язык программирования, о своем опыте и отличиях функционального подхода от других существующих принципов программирования.
- Сферы применения Haskell
- Эксперты — о необычности Haskell, его особенностях и перспективах
- Александр Гранин: Haskell, безусловно, помогает разработчику выйти на новый уровень
- Владислав Завьялов: Haskell позволяет понять программирование глубже, ведь именно через него можно освоить концепции функционального программирования
- Алексей Пирогов: На Haskell пишут значительно более разнообразное ПО, чем на том же PHP
- Денис Москвин: Будущее, в котором 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 и решать задачи на этом языке.
Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях
Haskell
Haskell — функциональный язык программирования, характеризующийся полной, строгой и статической типизацией с автоматическим выведением типов, поддержкой ленивых вычислений. Был разработан в 1990 году и первоначально использовался как инструмент для математических и научных исследований. Сегодня является одним из самых востребованных функциональных языков и достаточно широко применяется в промышленном программировании.
«IT-специалист с нуля» наш лучший курс для старта в IT
История
Предпосылкой к появлению компьютерного языка «Хаскелл» стала разработка в 1985 году другого функционального ЯП — «Миранда», в котором впервые была реализована концепция «ленивых» вычислений. Несмотря на то что «Миранда» получила хорошую коммерческую поддержку, этот язык распространялся по проприетарной лицензии и был закрыт для свободного исследования и развития.
Чтобы обойти это ограничение, различные разработчики начали создавать во второй половине 80-х годов разные свободные функциональные языки программирования, одним из которых и стал Haskell. Свое название он получил в честь американского математика Хаскелла Карри, который изобрел комбинаторную логику и развивал теорию типов.
Первая версия Haskell появилась в 1990 году, а через 8 лет комитет разработчиков представил The Haskell 98 Report. Именно этот стандарт по сей день остается основным, хотя совершенствование «Хаскелла» не останавливается и в него постоянно вносятся новые улучшения. Во многом это стало возможным благодаря открытому характеру языка: комитет, который занимается разработкой, бесплатно принимает предложения от всех желающих.
Профессия / 8 месяцев
IT-специалист с нуляПопробуйте 9 профессий за 2 месяца и выберите подходящую вам
Общая характеристика языка Haskell
Язык программирования «Хаскелл» относится к категории функциональных. Написанная на нем программа представляет собой набор функций в математическом смысле, то есть как зависимостей (соответствий) между элементами (аргументом и значением) двух множеств. При этом для вычисления значения функции имеют только исходные данные независимо от того, в каком порядке оно происходит.
Функция в Haskell — это основная структурная единица кода. Задача программиста заключается в описании ее таким образом, чтобы компилятору (программе, переводящей текст в машинный код) было понятно:
- какие параметры могут перейти в функцию;
- какие действия с ними нужно выполнить;
- в каком виде представить полученный результат.
Важной характеристикой языка «Хаскелл» является «ленивость». То есть функции вычисляются по мере их необходимости. Если для исполнения программы в каком-то случае не нужно знать значение конкретной функции — она откладывается «на потом». Этот принцип получил название «ленивых» (или отложенных) вычислений. Например, в программе «Калькулятор» заложено много функций, в том числе сложение, вычитание, умножение, деление и т.д. Но если пользователю в данный момент требуется именно сложение, будет выполнено только оно.
К другим важным характеристикам Haskell относятся:
Строгая статическая типизация. Тип данных — это категория элементов некоторого множества, к которым могут быть применены какие-либо определенные операции. Иными словами, он определяет, что это за данные, какие у них могут быть значения и что с ними можно сделать. У «Хаскелла» строгая и статичная система типов — это значит, что они четко различаются между собой, и это разделение задается еще на этапе компиляции, а не в процессе выполнения программы. Однако в данном языке есть особый тип данных, который называется монадой. Он представляет собой контейнер, содержащий значение произвольного типа. Наличие монад помогает выполнять на функциональном Haskell некоторые действия, свойственные императивному программированию: например, задавать последовательность операций, выполнять функции с побочными эффектами и т.д.
Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоитьМодульность. Программы, написанные на «Хаскелле», представляют собой совокупность независимых друг от друга блоков, каждый из которых выполняет определенную функцию. При этом программный код разбивается на отдельные файлы, содержащие модули. Такая структура упрощает разработку и тестирование ПО — при необходимости внести изменения или исправить ошибку можно только в конкретном модуле или элементе, не переделывая всю программу. Кроме того, модульность помогает ускорить разработку программного продукта, разделив модули между отдельными командами разработчиков.
Чистота. «Хаскелл» работает только с чистыми функциями, для которых характерны:
- строгая детерминированность — то есть каждому значению аргумента соответствует только одно значение функции;
- отсутствие побочных эффектов — воздействий функции на среду ее выполнения, таких как вызов обработчиков исключительных ситуаций (проще говоря, ошибок), чтение и изменение значений глобальных переменных и т.д.
Однако, так как для некоторых задач программирования требуются и недетерминированность, и присутствие побочных эффектов, в «Хаскелле» эти возможности предусмотрены с помощью монад.
Параметрический полиморфизм. Это способность оперировать значениями различных типов одним и тем же образом. Она повышает выразительность языка программирования и позволяет многократно использовать один фрагмент кода для работы с разными данными, что существенно упрощает и ускоряет разработку программного обеспечения. Проще говоря, программисту не нужно писать для обработки каждого типа данных свой код — достаточно использовать уже имеющийся, если он подходит.
Частичное применение. В «Хаскелле» по умолчанию функции с несколькими аргументами (многоместные) представляются как функции высшего порядка, в которых аргументами являются другие функции. Благодаря этому к функции можно «привязать» не особо важные или редко меняющиеся аргументы, а принимать (то есть непосредственно работать) она будет с важными и часто меняющимися.
Преимущества языка Haskell
Из особенностей «Хаскелла» вытекают и основные его преимущества перед другими языками программирования:
- «Чистые» и «нечистые» слои языка четко разделены, благодаря чему программисту легче работать с обоими по отдельности, что способствует пониманию кода не только тем, кто его написал, но и сторонним разработчиком.
- За счет разделения кода на отдельные блоки существенно упрощается тестирование программного обеспечения. Найти и исправить ошибку в отдельном модуле гораздо легче, к тому же не нужно переделывать весь программный продукт. Также это повышает устойчивость кода к ошибкам: если они происходят в одном модуле, то не обязательно отразятся на всей системе.
- Благодаря открытому характеру языка существует множество инструкций, библиотек готовых решений, справочных рекомендаций, книг по Haskell и других полезных материалов. Сформировалось довольно мощное комьюнити профессионалов и любителей: если разработчик столкнулся с проблемой во время работы над продуктом, у него есть где бесплатно попросить помощи или самостоятельно найти решение.
- Строгая типизация не позволяет смешивать значения различных типов и проводить неявные вычисления. Это существенно снижает вероятность ошибки или побочных эффектов при программировании. Если же разработчик все же использует неявные преобразования (Haskell это допускает), то сразу будет видеть, где код может сработать не так, как надо.
- За счет того, что типы присваиваются и проверяются еще на этапе компиляции, этот процесс не нужно проводить во время работы программы. Также за счет «ленивости» вычислений программа не тратит ресурсы на выполнение ненужных в данный момент функций, задействуя только необходимые. Соответственно, повышается скорость исполнения программного кода.
- Благодаря тому что функции в Haskell исполняются по мере востребованности, а не в порядке, прописанном программистом, с помощью этого языка достаточно просто добиться многозадачности и параллельного вычисления. Это тоже положительно влияет на быстродействие программы.
- Для «Хаскелла» разработано множество инструментов тестирования и отладки, интеграции с кодом на других языках программирования и т.д. Все это способствует тому, что он может успешно применяться не только для обучения или в академических интересах, но и для решения практических задач — от математических и научных расчетов до разработки приложений.
Недостатки языка Haskell
- Специфичный синтаксис, который может поначалу восприниматься как очень сложный и нерациональный. Особенно часто с этой проблемой сталкиваются опытные разработчики, привыкшие работать с языками в других, более мейнстримных парадигмах программирования. Напротив, Haskell для начинающих свой путь в программировании довольно прост, так как их сознание еще не настроено на конкретную парадигму.
- «Хаскелл» развивается неравномерно на различных платформах — его основные разработчики делают упор на Linux и MacOS и недостаточно уделяют внимание Windows. Из-за этого программисты, работающие на последней, сталкиваются с нехваткой инструментов, запозданием обновлений и другими проблемами.
- Хотя для Haskell существует множество репозиториев и библиотек, зачастую в них имеются только решения для типовых проблем. Если программист сталкивается с нестандартной задачей, то придется либо решать ее самостоятельно, либо обращаться за помощью к представителям сообщества.
- Активно развивается только основной компилятор Haskell GHC, причем это развитие происходит неравномерно. Из-за этого часто возникают проблемы с обратной совместимостью.
- Для Haskell на данный момент не существует хороших интегрированных сред разработки. Те, которые имеются сейчас, предлагают очень ограниченный набор возможностей вроде подсветки синтаксиса или простого автозаполнения по словарю. Другие функции, например навигация или рефакторинг (изменение внутренней структуры программы, не затрагивающее ее поведение), либо отсутствуют, либо очень неоптимизированные.
Применение Haskell
Язык программирования Haskell появился и первое время развивался в академической среде. Поэтому первой сферой его применения стало решение математических задач, проведение научных исследований, а также теоретическое изучение концепции функционального программирования как такового. Часто программисты, привыкшие работать с другими языками программирования, говорят, что изучать Haskell нужно только ради понимания его самого, а значимой практической ценности он не имеет. Это утверждение далеко от действительности — «Хаскелл» помогает решать те же самые практические задачи, что и большинство распространенных языков программирования. Вот лишь часть из них:
- Создание ПО для разработчиков. На языке «Хаскелл» написаны многие компиляторы для других языков, среды разработки, инструменты тестирования и т.д. За счет его функционального характера разработчикам проще оптимизировать преобразование программного кода в машинный, найти недочеты и уязвимости в ПО.
- Разработка других языков программирования. Созданный в академической среде, Haskell представляет собой как бы фундаментальный язык, который может использоваться для создания более прикладных, предметно ориентированных ЯП. Например, на его основе разработан Cryptol, на котором создаются криптографические алгоритмы, Bluespec SystemVerilog, с помощью которого проектируются и верифицируются полупроводниковые схемы, и т.д.
- Обработка и синтаксический анализ текста. С помощью Haskell можно создать простые и эффективные инструменты для анализа любого естественного или искусственного языка (включая компьютерные). Это достигается за счет того, что на «Хаскелле» проще задавать правила, которым подчиняется знаковая система. С его помощью можно разделять фразы и предложения на отдельные словосочетания, слова и предлоги, выявлять между ними связи, находить ошибки и неправильные конструкции. Все это используется в системах компьютерного анализа текста, используемых лингвистами, редакторами, копирайтерами, SEO-специалистами и т.д.
- Финансовые инструменты. Одно из требований, предъявляемых к ПО в финансовой сфере, — точность вычислений и отсутствие ошибок, цена которых может достигать миллиардов долларов. Поэтому многие системы для торговли на биржах, анализа рисков, учета банковских транзакций, бухучета и т.д. проектируются именно на Haskell.
- Обработка данных. Так как в «Хаскелле» данные четко разделены по типам, анализировать их и работать с ними становится значительно проще. Эту особенность языка эффективно используют и для фундаментальных исследований в Data Science, и для решения прикладных задач, связанных с обработкой больших массивов различной информации. Смежной сферой применения Haskell является разработка систем принятия решений, которые неизменно связаны с анализом данных.
- Прикладное программирование. «Хаскелл» активно используется для разработки сугубо прикладных приложений — десктопных, мобильных, серверных и т.д. Помимо компиляторов и других программ для разработчиков, на этом языке написаны некоторые операционные системы (например, экспериментальная House), текстовый редактор Yi, фреймовый оконный менеджер Xmonad и другие программные продукты. Также Haskell применяется в игровой сфере — например, для моделирования городских ландшафтов.
- Обучение. «Хаскелл» хорошо подходит для изучения основ функционального программирования за счет относительно простого синтаксиса и семантики, наличия большого количества справочных материалов, инструкций и поддержки комьюнити. Многие программисты считают, что этот язык является подходящим для понимания принципов программирования вообще.
Перспективы и проблемы Haskell
Развитие и применение языка программирования «Хаскелл» сталкивается с определенными проблемами:
- Низкой коммерческой поддержкой. Хотя Haskell может применяться для решения прикладных задач, сам язык не так активно поддерживается крупными игроками рынка, как его более распространенные собратья вроде JavaScript, C++, Python и т.д. Во многом это объясняется как специфичностью самого функционального программирования, так и закрепившейся за языком репутацией «академического».
- Непониманием со стороны сообщества. Многие начинающие и опытные программисты, изучающие другие парадигмы программирования, с трудом переходят на «Хаскелл» из-за его непривычности. Это создает ему репутацию «трудного языка», который к тому же мало востребован на рынке, чтобы тратить время и силы на его изучение.
- Появление других функциональных языков. «Хаскелл» во многом был и остается экспериментальной платформой, на которой исследуются различные возможности функционального программирования. Из-за этого, с одной стороны, в языке встречаются недочеты, с другой — его удачные решения «перетекают» в более новые языки, такие как Rust, PureScript. Они лишены его недостатков и «детских болезней», из-за чего выглядят более перспективными.
Тем не менее постепенно востребованность Haskell в прикладном программировании растет, хотя на сегодняшний день он по-прежнему сильно уступает по популярности другим распространенным языкам программирования. Специалисты неоднозначно оценивают его будущее, хотя в общем сходятся на том, что у этого ЯП большой потенциал, в том числе и в сфере прикладного ПО.
IT-специалист с нуля
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.
Статьи по теме:
Отвечает Евгений Козак, старший софт-инженер CitibankПочему для больших проектов обычно выбирают Java, средних — PHP, а быстро развивающихся стартапов — Ruby или Go
Где применяется «ленивый» язык программирования Haskell — о пользе лени или в каких отраслях и почему он востребован
Интересуетесь новыми языками программирования, которые помогут вывести бизнес на новый уровень? Обратите внимание на Haskell! Читайте подробнее, что это такое и где используется. Рассказывает ИТ-агентство BGStaff.
время на прочтение: 2 мин.
Haskell — это достаточно нестандартный язык с точки зрения тех, кто привык к JavaScript, С++, Python и прочим императивным разновидностям. Это обусловлено тем, что Хаскелл относится к функциональному типу. В статье подробно разберем особенности языка программирования Haskell. Расскажем, что это, в каких направлениях используется.
Что это за язык
Итак, Хаскелл принадлежит к категории функциональных языков. Программа, выполненная на нем — это набор функций в математическом смысле. То есть, как соответствий между элементами (аргументом и значением) 2-х множеств. Для получения значения функции имеются исключительно исходные данные вне зависимости от того, в каком порядке совершается вычисление.
Функция в данном языке программирования — основной структурный элемент кода. ИТ-сотрудник должен описать ее так, чтобы программе, которая переводит текстовые данные в машинный код, стало понятно:
- какие параметры переходят в функцию;
- какие действия с ними надо совершить;
- в каком формате предоставить получившийся результат.
Еще одна основная характеристика — «ленивость». Это означает, что функции вычисляются по мере их необходимости. Если сейчас не нужно знать значение определенной функции, она переносится «на потом». Именно это и называется «ленивым» или «отложенным» вычислением.
Приведем простой пример. Приложение «Калькулятор» предусматривает много функций (вычитание, умножение, деление и прочее). Однако если вам требуется именно сейчас только сложить цифры, будет выполнено лишь это.
Сферы применения
Часто Haskell используется в финансовом направлении. Его применяют банки и другие фирмы из отрасли финансов для разработки персональных инструментальных средств. Язык востребован в этой сфере благодаря гарантии верности вычислений без появления программных ошибок.
Хаскелл используют для генерации средств:
- обрабатывания текстовых файлов;
- синтаксического разбора;
- разработки систем антиспама.
Устройство Хаскелл дает возможность заложить в него языковые правила, в т. ч. и русского языка, научить алгоритмы находить связи с ними.
Создание средств для испытания программных языков — еще одно направление, в котором используется Haskell. В данном случае применяется тот же алгоритм, что и для обрабатывания текстовых файлов. Хаскелл способен работать не только с обычными, но и с программными языками.
WEB-разработка — еще один сектор, где применяется язык программирования Haskell. Он может использовать компилятор для JavaScript для открытия в браузере. На сервере же запускается в виде машинного кода, который оперативно обрабатывает множество параллельных подключений.
Востребованность программистов
Хаскелл — это язык стартапов, который активно внедряется в коммерческую разработку. За границей он уже пользуется высоким спросом, в России же только начинает набирать популярность. Хотя его первая версия и была выпущена еще в 1990 году.
Разработчиков Haskell набирают в штат крупнейшие корпорации, например:
- Яндекс;
- Ru Group;
- Avito;
- Just Work;
- ВКонтакте и другие.
Высокий спрос на IT-специалистов обусловлен тем, что Хаскелл отличается высокой точностью, устраняет риск возникновения программных ошибок. Haskell — достаточно новый язык, поэтому программистов, работающих с ним, не так много.
К тому введение в него не отличается простотой, поэтому за его изучение берутся не все. Из-за того, что спрос на IT-специалистов превышает предложение на трудовом рынке, работодатели готовы хорошо оплачивать работу таких сотрудников.
Где найти сотрудника в компанию
Найти сотрудников, которые работают с Хаскелл, достаточно непросто, что связано с небольшим количеством таких программистов в России. Доски объявлений и тематические сайты (HH и другие) обычно не дают результата при поиске.
Можно поискать кадры в сайтах Телеграмм, на форумах, посвященных этой теме. Однако это тоже не станет гарантией, что вакансию удастся быстро закрыть. Лучшим решением будет обратить в наше кадровое агентство BGStaff. Мы имеем широкую базу, поэтому сможем оперативно найти ИТ-специалистов, которые будут соответствовать всем вашим требованиям и справятся с возложенными на них задачами на 100%.
Найдем ИТ-специалистов любого уровня и направлений
- Работаем без предоплаты
- Первый кандидат через 3 дня
- Финансовая гарантия в течение 3 месяцев
Haskell, зачем он сейчас? Как состояние ФП?
Всем привет. Помню как появился Haskell и много стали говорить о промышленном применении ФП.
А где сейчас применяется Haskell? Какого его промышленное применение? Зачем он современному миру, кроме тестирования каких-либо подходов?
То же касательно и других ФП-языков — кто-то полноценно жив?
silver-bullet-bfg ★★
02.07.18 06:56:41 MSK
← 1 2 3 4 →Elixir учи, оставь хаскель фетишистам. От него хоть какая-то польза.
anonymous
( 02.07.18 06:59:55 MSK )Facebook же. Фильтрация спама и прочего нежелательного контента написана на Haskell, где лишь небольшая часть написана на C++.
dave★★★★★
( 02.07.18 07:32:26 MSK )
Последнее исправление: dave 02.07.18 07:35:58 MSK (всего исправлений: 1)Ответ на: комментарий от dave 02.07.18 07:32:26 MSK
Фильтрация спама и прочего нежелательного контента написана на Haskell
Вопрос в том, написана ли она на хаскелл потому что на нем было проще и быстрее ее написать, либо потому что кому-то ОЧЕНЬ хотелось ее написать на хаскелл.
Im_not_a_robot★★★★★
( 02.07.18 07:39:37 MSK )
Ответ на: комментарий от Im_not_a_robot 02.07.18 07:39:37 MSKКстати, правильный вопрос. Особенно потому, как разрабы Facebook прикалываются жестко по ML
silver-bullet-bfg ★★
( 02.07.18 07:41:53 MSK ) автор топика
Ответ на: комментарий от anonymous 02.07.18 06:59:55 MSKElixir — тоже мир ФП. Вот мне и интересно в каком он состоянии сейчас.
silver-bullet-bfg ★★
( 02.07.18 07:42:20 MSK ) автор топикаЗачем он современному миру, кроме тестирования каких-либо подходов?
Так тем и хорош, язык прототипов и аутистов — такая уж ниша.
Прототип взлетает и его переставляют на промышленные рельсы.
Ну и полезно чтобы мозги развивать.То же касательно и других ФП-языков — кто-то полноценно жив?
Exmor_RS ★★★
( 02.07.18 07:52:23 MSK )
Ответ на: комментарий от Exmor_RS 02.07.18 07:52:23 MSKНу и полезно чтобы мозги развивать.
А это случайно не такой же миф, как и «ставь рач/генту/слаку, чтобы разобраться линуксе, у убунту/федоре НЕ ТО»?
Im_not_a_robot★★★★★
( 02.07.18 08:07:56 MSK )
Ответ на: комментарий от Im_not_a_robot 02.07.18 08:07:56 MSKНу учитывая что это не миф. Но рач-гента-слака просто проще, особенно новичку. Мозги действительно развивает, но главное не поехать на этой почве. Поэтому же новичку не очень вариант.
anonymous
( 02.07.18 08:12:58 MSK )
Ответ на: комментарий от Im_not_a_robot 02.07.18 07:39:37 MSKТакой вопрос можно задать практически по абсолютно _любому_ проекту. Можно и до ядра линукса докопаться. А почему вот ядро линукса написали на Си, а не на Паскале или Аде?! Я вижу, что вам очень хочется прикопаться, но не можете.
Автор всегда предвзят в своем выборе. Так устроены люди. Кто пытается говорить иное, это обычно пустая болтовня и чушь собачья. Выбор почти всегда есть.
dave★★★★★
( 02.07.18 08:16:21 MSK )
Последнее исправление: dave 02.07.18 08:24:02 MSK (всего исправлений: 1)В основном это серверный софт, бэкенды, обработка данных и прочая подобная хрень.
Зачем он современному миру, кроме тестирования каких-либо подходов?
Код писать на нём удобно.
То же касательно и других ФП-языков — кто-то полноценно жив?
OCaml, Erlang, Scala.
hateyoufeel ★★★★★
( 02.07.18 08:23:08 MSK )Помню как появился Haskell и много стали говорить о промышленном применении ФП.
Ты про Haskell 1.0 или Haskell 98?
А где сейчас применяется Haskell? Какого его промышленное применение?
Написание лабораторных работ в промышленных масштабах (подразумевается мелкая кустарная промышленность).
Virtuos86 ★★★★★
( 02.07.18 08:28:10 MSK )
rotfront
( 02.07.18 08:30:15 MSK )
Ответ на: комментарий от hateyoufeel 02.07.18 08:23:08 MSKавтор, наверное, это имел ввиду
MyTrooName ★★★★★
( 02.07.18 08:37:22 MSK )
Ответ на: комментарий от dave 02.07.18 08:16:21 MSKИ много вы видели ядер на паскале и аде? Выбора, зачастую, как раз и нет.
RazrFalcon★★★★★
( 02.07.18 08:41:09 MSK )
Ответ на: комментарий от RazrFalcon 02.07.18 08:41:09 MSKЕсли операционную систему переписать на Pascal или Ada, то, боюсь, такая семантическая херня получится — всё равно что выкрасить и выбросить.
iZEN ★★★★★
( 02.07.18 08:44:32 MSK )
Последнее исправление: iZEN 02.07.18 08:45:03 MSK (всего исправлений: 1)Ответ на: комментарий от RazrFalcon 02.07.18 08:41:09 MSK
На Ada их есть. Алсо, никто не мешает для лялекса модули хоть на том же хацкелле писать. Разве что Линус заклюёт.
hateyoufeel ★★★★★
( 02.07.18 08:48:56 MSK )для саморазвития. Можно отдохнуть от плюсов, писюкая что-то на хаскеле
seryoga
( 02.07.18 08:50:06 MSK )
Ответ на: комментарий от hateyoufeel 02.07.18 08:48:56 MSKНа JS тоже есть. Но мы же про применяемые ОС говорим.
Модули вообще отдельная песня.
RazrFalcon★★★★★
( 02.07.18 09:01:49 MSK )Сейчас все на Golang пишут, у хаскыля нет преимуществ!
anonymous
( 02.07.18 09:08:44 MSK )То же касательно и других ФП-языков — кто-то полноценно жив?
Скала точно жива.
ugoday ★★★★★
( 02.07.18 09:44:29 MSK )
Ответ на: комментарий от Im_not_a_robot 02.07.18 08:07:56 MSKК счастью не такой же — изучение разных языков программирования действительно может развивать программиста (становиться их фанатом и спешно переписывать продакшен на них при этом не требуется).
В некоторой степени такой подход и с разными видами линуксов работает: надо пробовать, искать сильные и слабые стороны.
Exmor_RS ★★★
( 02.07.18 09:44:56 MSK )
Ответ на: комментарий от RazrFalcon 02.07.18 08:41:09 MSKНа Аде точно должно быть. И ты только прикинь, операционки писали и до появления Си. Вот же ж бедные!
dave★★★★★
( 02.07.18 09:58:37 MSK )
Ответ на: комментарий от dave 02.07.18 09:58:37 MSKИ каким образом это оправдывет выбор именно хаскеля?
RazrFalcon★★★★★
( 02.07.18 10:07:06 MSK )Scala в топ 20, Haskell в топ 30
Crocodoom★★★★★
( 02.07.18 10:09:27 MSK )
Ответ на: комментарий от Crocodoom 02.07.18 10:09:27 MSKа дубликаты и левые теги там учтены ? ни раз открывал проект где тег яваскрипт а внутри код С
anonymous
( 02.07.18 10:16:13 MSK )
Ответ на: комментарий от anonymous 02.07.18 10:16:13 MSKни раз открывал проект где тег яваскрипт а внутри код С
Это коварные сишники заманивают жертв в свои репы.
Virtuos86 ★★★★★
( 02.07.18 10:29:37 MSK )В ФП нет состояния, еретик.
anonymous
( 02.07.18 10:30:07 MSK )
Ответ на: комментарий от anonymous 02.07.18 10:30:07 MSKА как же монада State в хаскелле?
Virtuos86 ★★★★★
( 02.07.18 10:31:55 MSK )
Ответ на: комментарий от RazrFalcon 02.07.18 10:07:06 MSKВ эту игру можно играть вдвоем. А почему не haskell-то? Что оправдывает его не выбирать? Тем более, если есть специалисты по haskell. Где логика-то у тебя?
dave★★★★★
( 02.07.18 10:35:45 MSK )
Ответ на: комментарий от Virtuos86 02.07.18 10:31:55 MSKЭто коварные хаскеллисты заманивают императивщиков.
anonymous
( 02.07.18 10:37:51 MSK )Его нет. Причина одна — работодателю трудно найти замену кодеру, если тот вдруг встанет на лыжи. Хороший менеджер минимизирует риски, а фп это прежде всего фактор риска, а потом уже динамические опердени и приседания со штангой.
Deleted
( 02.07.18 10:40:13 MSK )
Последнее исправление: rj45 02.07.18 10:41:55 MSK (всего исправлений: 1)Ответ на: комментарий от Virtuos86 02.07.18 10:31:55 MSK
Это просто аккумулятор хвостовой рекурсии
nihirash ★★★
( 02.07.18 10:42:23 MSK )
Ответ на: комментарий от nihirash 02.07.18 10:42:23 MSKVirtuos86 ★★★★★
( 02.07.18 10:44:00 MSK )
Ответ на: комментарий от nihirash 02.07.18 10:42:23 MSKЭто просто аккумулятор хвостовой рекурсии
Шеф, нас раскрыли!
rotfront
( 02.07.18 10:46:53 MSK )
Ответ на: комментарий от silver-bullet-bfg 02.07.18 07:42:20 MSKМешать в кучу ml и динамически типизируемый эрланг это то же самое что и встать и громко сказать: «я полный дебил, нихрена не понимаю». Если вы полимаете о чём я, инфа 100% Лол 🙂
anonymous
( 02.07.18 10:49:59 MSK )
Ответ на: комментарий от Deleted 02.07.18 10:40:13 MSKфп это прежде всего фактор риска
Плюсы тут тоже вполне себе риски — можно такой неподдерживаемой херни написать, что даже матерый плюсовик умрет от вида кода.
На джавке бывает код весь на статиках да миллиард строк кода на класс.
Риски — нанимать говнокодеров. Вне зависимости от языка или парадигмы.
nihirash ★★★
( 02.07.18 10:50:48 MSK )haskell уже не нужен, так как есть rust. Там АДТ, трейты, кложуры и экспрешн-бейзд но нет ублюдочной ленивости и с производительностью все в порядке.
provaton ★★★★★
( 02.07.18 10:53:29 MSK )
Ответ на: комментарий от provaton 02.07.18 10:53:29 MSKВедь есть eta-lang
nihirash ★★★
( 02.07.18 10:57:51 MSK )
Ответ на: комментарий от rotfront 02.07.18 10:46:53 MSKЧто то я разошелся, так можно раскрыть все секреты моноидов в категории эндофункторов
nihirash ★★★
( 02.07.18 11:05:38 MSK )Язык как язык. Новые релизы выходят, новые библиотеки пишутся. Если интересен — изучай.
Из особенностей: — чистый функциональный (сайд-эффекты явно выражены в типах) — строгая статическая типизация с большим количеством экспериментальных расширений (позволяет записать сложные инварианты на уровне типов; как результат код легко подкрживатт) — ленивая модель вычислений (одна из самых необычных сторон языка) позволяет проще поддерживать и распараллеливания код и повышает выразительность языка (рекурсия не является проблемой). Красивым примером является либа parsec.
anonymous
( 02.07.18 11:13:26 MSK )
Ответ на: комментарий от dave 02.07.18 10:35:45 MSKОбщая академичность, bus factor.
RazrFalcon★★★★★
( 02.07.18 11:17:02 MSK )
Ответ на: комментарий от provaton 02.07.18 10:53:29 MSKhaskell уже не нужен, так как есть rust. Там АДТ, трейты, кложуры и экспрешн-бейзд но нет ублюдочной ленивости и с производительностью все в порядке.
Жаль только чистых функций нет, а mut есть.
Crocodoom★★★★★
( 02.07.18 11:22:14 MSK )
Ответ на: комментарий от RazrFalcon 02.07.18 11:17:02 MSKЧто такое это ваша академичность?
Академичный == не подходит для прикладных задач? Но ведь отлично же подходит. Нужные библиотеки есть, книжки есть, сообщество есть. И ситуация улучшается с каждым годом.
Или это академичный == сложный? Да, язык действительно сложный для освоения. Причём тут наоборот, с каждым годом становится всё сложнее. Но это полностью ортогонально академичности! Теория ракетостроения или там наноэлектроника тоже очень сложные, но совершенно прикладные области.
Crocodoom★★★★★
( 02.07.18 11:37:27 MSK )
Ответ на: комментарий от Crocodoom 02.07.18 11:37:27 MSKТеория ракетостроения или там наноэлектроника тоже очень сложные, но совершенно прикладные области
Прикладные, но в очень узком диапазоне. Там, где эта сложность оправдана получаемой прибылью. А для какой области прикладного программирования оправдана сложность хаскеля?
no-such-file ★★★★★
( 02.07.18 11:49:54 MSK )
Ответ на: комментарий от no-such-file 02.07.18 11:49:54 MSKА для какой области прикладного программирования оправдана сложность хаскеля?
Проблема не в сложности, проблема в фрагментированности сообщества. Например, они так и не договорились, как возвращать ошибки. Или как именно организовывать монадический стек. Война stackage и hackage.
kirk_johnson★☆
( 02.07.18 11:53:38 MSK )
Последнее исправление: kirk_johnson 02.07.18 11:54:48 MSK (всего исправлений: 1)Ответ на: комментарий от no-such-file 02.07.18 11:49:54 MSK
А для какой области прикладного программирования оправдана сложность хаскеля
Ну вот например parsec (либа для написания парсеров) тут уже приводили. В областях и задачах, где сложность присутствует изначально, хаскель несомненно нужен.
Crocodoom★★★★★
( 02.07.18 12:00:48 MSK )
Ответ на: комментарий от RazrFalcon 02.07.18 09:01:49 MSKНо мы же про применяемые ОС говорим.
Ты просто про операционки общего назначения говоришь 🙂 И таки на аде полно применяемых ОС. Только не на локалхосте, а на встройке, в «мишон критикал» и RT-сегменте.
slackwarrior ★★★★★
( 02.07.18 12:02:55 MSK )
Последнее исправление: slackwarrior 02.07.18 12:03:15 MSK (всего исправлений: 1)Ответ на: комментарий от Crocodoom 02.07.18 12:00:48 MSK
Ну какие у parsec плюсы относительно миллиона других генераторов?
kirk_johnson★☆
( 02.07.18 12:07:32 MSK )
Ответ на: комментарий от slackwarrior 02.07.18 12:02:55 MSKИ таки на аде полно применяемых ОС.
Назови Топ10. Да хоть Топ5.
tailgunner ★★★★★
( 02.07.18 12:10:31 MSK )
Ответ на: комментарий от tailgunner 02.07.18 12:10:31 MSKАда точно использовалась американскими военными пару лет назад. Там всё серьёзно — правительственные контракторы без права на ошибку, всё это.
anonymous
( 02.07.18 12:15:28 MSK )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
← 1 2 3 4 →Похожие темы
- Форум Книги по языку Haskell (2012)
- Форум Дружба C++ и Haskell (2015)
- Форум CMake, Haskell и С++ (2015)
- Форум Рекурсия в Haskell (2020)
- Форум [haskell] соц. опрос (2011)
- Новости Мастер-класс по Haskell в Новосибирске (2014)
- Форум Haskell. Советы начинающему функционалу. (2006)
- Форум Haskell для JVM: eta vs frege (2019)
- Форум Сфера применения haskell, lisp, scheme? и др. функциональщины? (2008)
- Форум Зачем в Haskell IO? (2022)