Вступление
Haskell это чистый функциональный язык программирования общего назначения со статической типизацией и ленивыми вычислениями. Появился в 1990 году и был назван в честь Хаскелла Карри. На данный момент основной реализацией является компилятор GHC.
Мы в Typeable очень любим этот язык и используем его как основной язык разработки. Хотя Haskell уже достаточно широко используется в индустрии, всё ещё бытует мнение, что это язык для академиков и применяется исключительно в научных целях. В этой статье я бы хотел рассказать про несколько достаточно популярных инструментов, которые написаны на Haskell и могут оказаться вам полезны.
Полезные инструменты на Haskell
1. Xmonad
Xmonad — тайловый оконный менеджер для X Window System, написанный на Haskell. Отличительной особенностью этого тайлового менеджера является то, что он конфигурируется также на языке Haskell, что позволяет нам использовать все возможности языка. Таким образом, настраивая наш оконный менеджер, можно подтянуть данные о погоде, замерять состояние системы и т.п.
Пример настроенной системы (by erikbackman)
Для дальнейшего изучения можно пройти на сайт xmonad.
2. ShellCheck
ShellCheck — это утилита для анализа скриптов, написанных на bash. Она позволяет новичкам ловить частые ошибки, когда они только начинают изучать этот скриптовый язык, а более опытным пользователям помогает не пропустить мелкие ошибки в больших и сложных скриптах. Проект постоянно расширяется, а большое коммьюнити добавляет новые правила. ShellCheck можно посмотреть и попробовать на https://www.shellcheck.net/
Для примера будем использовать вот такой скрипт (попробуйте найти в нём ошибки, не заглядывая в результат проверки):
#!/bin/bash
## Example: ShellCheck can detect some higher level semantic problems
while getopts "nf:" param
do
case "$param" in
f) file="$OPTARG" ;;
v) set -x ;;
esac
done
case "$file" in
*.gz) gzip -d "$file" ;;
*.zip) unzip "$file" ;;
*.tar.gz) tar xzf "$file" ;;
*) echo "Unknown filetype" ;;
esac
if [[ "$$(uname)" == "Linux" ]]
then
echo "Using Linux"
fi
Проверить файл очень просто: shellcheck example.bash.
В результате нам скажут о всех потенциально ошибочных местах в скрипте:
3. PureScript
На Haskell написано несколько популярных компилируемых функциональных языков для фронтенд-разработки, которые в итоге транспилируются в JavaScript. Сегодня мы поговорим о PureScript. У этого языка строгая система типов, которая поддерживает алгебраические типы данных, HKT (Higher-Kinded Types), тайпклассы с функциональными зависимостями. Также поддерживаются несколько необходимых и приятных фич, например FFI (Foreign Function Interface) с JS, а JS который получается на выходе выглядит очень даже читаемым. Язык уже оброс своей экосистемой в виде пакетного менеджера spago и IDE на основе своего собственного language server'а.
Для дальнейшего изучения можно пойти на официальный сайт https://www.purescript.org/
4. Agda
Haskell действительно хорошо подходит для создания языков программирования! Ещё один пример — Agda. Это язык с зависимыми типами, похожий по синтаксису на Haskell и имеющий серьёзную теоретическую основу. Но это ещё и система автоматического доказательства теорем: логические высказывания соответствуют типам, а доказательством правильности является успешный тайпчекинг.
Зачем всё это нужно? В первую очередь это позволяет избежать огромного количества ошибок времени выполнения и до какой-то степени не позволяет программисту написать неправильный код, как бы утопично это ни звучало. Рассмотрим классический пример: нам хотелось бы написать функцию head, которая берёт голову списка, но мы хотим быть уверены, что не передаём этой функции пустой список нигде в нашей программе.
-- Натуральные числа в виде чисел Пеано и их сложение
data Nat : Set where
zero : Nat
suc : Nat -> Nat
_+_ : Nat -> Nat -> Nat
zero + m = m
suc n + m = suc (n + m)
-- Вектор, зависимый тип, у которого длина хранится в типе
data Vec (A : Set) : Nat -> Set where
[] : Vec A zero
_::_ : {n : Nat} -> A -> Vec A n -> Vec A (suc n)
-- head, который нельзя применить к пустому вектору
head : {A : Set}{n : Nat} -> Vec A (suc n) -> A
head (x :: xs) = x
5. PostgREST
PostgREST это самостоятельный веб-сервер, который превратит схему вашей базы данных прямо в RESTful API. Такой подход позволяет не писать бойлерплейт, связанный с CRUD, а сосредоточиться на важных деталях бизнес-логики. Из плюсов можно выделить использование бинарного протокола postgresql, сериализацию JSON напрямую в SQL, для повышения производительности.
Для пример возьмем простую схему городов и стран:
В итоге для такой схемы мы получаем следующий API:
Документация: https://postgrest.org/en/v8.0/index.html
6. Octopod
Octopod — разработанный нами в Typeable сервис (да-да, бессовестный самопиар!), который дает вашей команде возможность использовать всю мощь Helm без необходимости в технических знаниях. Наше решение позволяет упростить управление динамическими окружениями для всей команды: DevOps, разработчиков, тестировщиков и менеджеров проектов. Все, что вам нужно, это просто указать URL до Helm репозитория, а Октопод дальше автоматически достанет необходимые конфигурации.
Про этот сервис мы писали ранее, а дополнительную информацию можно найти на странице Octopod на нашем сайте и в репозитории на GitHub.
7. Pandoc
Pandoc это такой швейцарский нож, который позволяет из одного текстового формата перегнать данные в совершенно другой формат. Утилита понимает множество полезных синтаксических расширений, включая метаданные документа: автор, заголовок, даты, cноски, таблицы, подсветка снипетов кода, вставки LaTex с формаулами и т.д… Из поддерживаемых форматов документов можно перечислить Markdown, epub, docs, RTF, ODT, HTML, LaTeX, различные форматы wiki-разметки и библиографии.
Скачать и посмотреть все поддерживаемые форматы можно тут: https://pandoc.org/
Я не стал перечислять все поддерживаемые варианты конвертации, потому что на это ушла бы вся статья. Только посмотрите на граф того, что и куда можно преобразовать: осторожно, большая картинка
Заключение
В этом списке я перечислил open-source проекты, которые показались мне наиболее интересны и полезны для широкого круга людей. Этот список можно использовать как ответ на вопрос "А чего полезного написали на Haskell за пределами науки?".
Конечно, список неполный и его можно продолжать, и если вы считаете, что какой-то сервис должен быть в этом списке или просто хотите поделиться крутым инструментом на Haskell — пишите в комментариях, может быть это именно то, что пригодится другим читателям.
7 полезных инструментов на Haskell
Вступление Haskell это чистый функциональный язык программирования общего назначения со статической типизацией и ленивыми вычислениями. Появился в 1990 году и был назван в честь Хаскелла Карри. На...
habr.com