Pull to refresh
0
Typeable
Functional programming, High assurance, Consulting

7 полезных инструментов на Haskell

Reading time5 min
Views9.2K

Вступление


Haskell это чистый функциональный язык программирования общего назначения со статической типизацией и ленивыми вычислениями. Появился в 1990 году и был назван в честь Хаскелла Карри. На данный момент основной реализацией является компилятор GHC.


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



Полезные инструменты на Haskell


1. Xmonad


Xmonad — тайловый оконный менеджер для X Window System, написанный на Haskell. Отличительной особенностью этого тайлового менеджера является то, что он конфигурируется также на языке Haskell, что позволяет нам использовать все возможности языка. Таким образом, настраивая наш оконный менеджер, можно подтянуть данные о погоде, замерять состояние системы и т.п.


Пример настроенной системы (by erikbackman)
Xmonad example


Для дальнейшего изучения можно пройти на сайт 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.


В результате нам скажут о всех потенциально ошибочных местах в скрипте:
Shellcheck example


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, для повышения производительности.


Для пример возьмем простую схему городов и стран:


Database schema
В итоге для такой схемы мы получаем следующий API:


Swager


Документация: 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 — пишите в комментариях, может быть это именно то, что пригодится другим читателям.


Вам также может понравиться:


  1. Как мы выбираем языки программирования в Typeable
  2. А вы знаете, где сейчас используется Лисп?
  3. Сильные стороны функционального программирования
  4. Haskell – хороший выбор с точки зрения безопасности ПО?

Версия на английском языке: https://typeable.io/blog/2021-10-18-haskell-tools.html

Tags:
Hubs:
Total votes 15: ↑15 and ↓0+15
Comments34

Articles

Information

Website
typeable.io
Registered
Founded
Employees
11–30 employees
Location
Россия