Haskell

Материал из ALT Linux Wiki
50px-Gnome globe current event.png
Данная статья периодически обновляется.
Последнее обновление
21:50 21 июля 2025

Небольшие заметки по Haskell/GHC в Сизифе

Вводные термины

Haskell - чистый функциональный язык программирования общего назначения.

GHC - на данный момент основной и самый продвинутый компилятор Haskell.

cabal - менеджер пакетов для Haskell. Так же называется расширение файлов с метаинформацией о пакете. Непосредственно запускаемую программу cabal для большей ясности будем называть cabal-install (по имени пакета)

Текущее состояние дел

В Sisyphus собрана достаточно актуальная (на 2025 год) версия компилятора GHC - 9.6.7 и cabal-install 3.14.2.0

Это два определяющих инфраструктуру пакета, их сборка происходит в режиме бутстрапа (см. статью Haskell/GHC)

Версионирование GHC

Политика наименования пакетов с GHC следующая:

В версии X.Y.Z число X.Y будем называть мажором, а Z - релизом.

В Сизифе может быть произвольное число мажорных релизов компилятора, причём установленных в системе параллельно (они в общем никак никому не мешают, только возможны периодические FTBFS на этапе создания документации. ).

Основной пакет с компилятором именуется следующим образом: ghc{мажор}, т.е. для GHC 9.6.6 пакет будет называться ghc9.6 (так же и gear репозиторий).

Архитектура проекта на Haskell

Основные моменты

*.cabal - главный файл проекта. В нём указаны:

  • Метаинформация (название, версия, лицензия, мейнтейнер и прочее)
  • Зависимости (build-depends).
  • Точки входа (executable, library, test-suite).
  • Опции компиляции и флаги.

Исходный код обычно располагается в директориях:

  • src/ - для библиотек.
  • app/ - для исполняемых файлов.
  • test/ - для тестов.

Это стандартные пути, которые предлагаются при инициализации проекта через cabal init. Но, строго говоря, они могут быть любыми. Стоит обратить внимание на hs-source-dirs в .cabal файле

Setup.hs - настраиваемый сценарий сборки. Представляет собой haskell-программу с вызовами функций Cabal и/или внешними действиями. Сейчас, как правило, не используется. Для всех пакетов предусматривается сценарий сборки по умолчанию.

Файлы, расширения и как в них ориентироваться

Файлы исходного кода:

  • .hs - основные файлы, обычный код на Haskell.
  • .lhs - Literate Haskell. Файл с исходным кодом, совмещённым с документацией (обычно в формате Markdown или LaTeX). Используется редко, но поддерживается.
  • .hsc - Исходники для hsc2hs (используется для привязок к C).
  • .hs-boot - заглушки для разрешения циклических зависимостей.

Файлы сборочной системы:

  • .cabal - см. раздел "Основные моменты"
  • stack.yaml - конфигурация для Stack (указывает версию GHC, snapshot пакетов). Файл не очень интересный пользователю/мейнтейнеру Альта. Практически во всех случаях можно обойтись cabal-install.
  • cabal.project - файл с дополнительными параметрами для cabal-install.

Артефакты компиляции:

  • .hi - файл интерфейса Haskell (создаётся GHC, содержит информацию о модуле).
  • .hie - файлы индексации для IDE (Haskell Language Server).
  • .o - объектный файл.
  • .dyn_hi / .dyn_o - аналоги, создающиеся при динамической линковке.

Утилиты для кодогенерации:

  • .x - грамматики для Alex (генератор лексеров).
  • .y - грамматики для Happy (генератор парсеров).

Профайлинг (в первую очередь нужен при отладке, в жизни нормального человека не появляется):

  • *_p.{a,so,hi} - то же самое, что и в обычном смысле, но с дополнительно подключенными опциями профайлинга.
  • .prof - результаты профилирования (вывод +RTS -p).
  • .hp - профили кучи (для генерации графиков через hp2ps).
  • .ps - векторные графики из .hp (PostScript).

Сборка пакетов

Среди всех мажоров компилятора выделяется один - "стабильный". Он ставится при помощи метапакета ghc. Его же и следует (но не обязательно) использовать для сборки пакетов.

RPM макросы находятся в rpm-build-haskell (-vendored)

См. статьи Haskell/RPM и Haskell/Vendored

Наименование пакетов

Запускаемые программы, написанные на Haskell, должны называться просто по апстримному наименованию. Например alex или cabal-install.

Библиотеки называются следующим образом: ghc{мажор}-{название_библиотеки}, в случае сборки библиотеки со "стабильным" GHC библиотеку следует называть ghc-{название_библиотеки}

Основные репозитории

  • Текущие мажоры GHC:
  • Метапакет - ghc

Подробнее