Haskell — ленивый язык программирования
easy

Haskell — ленивый язык программирования

Он сам решает, что и когда нужно посчитать.

Haskell — необычный язык с точки зрения тех, кто привык к JavaScript, С++, Python или любому другому императивному языку. Всё дело в том, что Haskell — функциональный язык. Мы уже рассказывали, чем отличаются функциональные языки от остальных, теперь посмотрим на них в деле.

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

Синтаксис в Haskell

Самая простая программа на Haskell выглядит так:

// Комментарий
main = putStrLn "Hello World!"

Давайте разберём, как работает единственная строка в программе. Main — это как бы главная функция, которая возвращает какое-то значение. В нашем случае оно возвращает значение вывода на экран строки "Hello World!". Компилятор знает, что putStrLn — функция вывода на экран, но если бы он этого не знал, нам нужно было бы написать так:

// Комментарий
main :: IO ()
main = putStrLn "Hello World!"

Теперь мы явно указали тип функции main — это ввод и вывод каких-то результатов (IO — input/output, ввод-вывод). Ещё в Haskell есть такие базовые типы данных:

  • Integer — целое число
  • Char — символ
  • Double — число с плавающей точкой или дробное число

А ещё есть специальные конструкции (), [] и ->, с помощью которых можно сделать свои типы данных на основе базовых, например, список или массив.

Математические операции в Haskell работают и выглядят как обычно: +, –, *, /.

Функции и их значения

Почти всё в Haskell делается через функции. Задача программиста — описать функцию таким образом, чтобы компилятор понял:

  • какие параметры могут прийти в функцию,
  • что с ними нужно сделать,
  • в каком виде нужно отдать результат.

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

// факториал — произведение чисел от единицы до этого числа. 
// к примеру, факториал трёх равен 1 * 2 * 3

fac :: Integer -> Integer

fac 0 = 1

fac n | n > 0 = n * fac (n - 1)

Первая строка после комментариев говорит нам, что мы объявляем новую функцию (fac),и работать с типами данных (::) она будет так: на вход ей поступит целое число (Integer) и на выходе функция вернёт тоже целое число (-> Integer).

Вторая строка отвечает за то, что если нужно посчитать факториал ноля, то это будет единица.

Последняя строка — самая сложная и интересная. Следите за математической мыслью: факториал любого числа n (fac n), где n больше нуля (| n > 0), равен произведению этого числа (n *) на факториал предыдущего числа (fac (n – 1)).

Если пока непонятно, что тут происходит, — почитайте про рекурсию, там мы подробно разобрали этот пример.

Мы только что записали строгое математическое определение на Haskell и объяснили функции, как ей найти факториал любого числа. Но если мы попробуем вызвать факториал числа 4.5, то Haskell выдаст ошибку, потому что 4.5 не относится к типу Integer.

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

Ленивые вычисления

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

Например, у нас есть функция, которая возвращает какое-то значение после вызова. Если это значение прямо сейчас не нужно или оно не используется при вызове функции, то Haskell не будет его считать. Он дождётся того момента, когда значение функции понадобится в другом месте, и только тогда посчитает его.

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

Для чего нужен Haskell

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

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

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

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

Текст

Михаил Полянин

Редактор

Михаил Полянин

Корректор

Ирина Михеева

Иллюстрация

Даня Берковский

Вёрстка

Мария Дронова

Глашатай

Виталий Вебер

Лениво вычисляет

Родион Скрябин

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy