Haskell
Небольшие заметки по 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:
- ghc9.6 - стабильный
- Метапакет - ghc
