March 20, 2023

Haskell セットアップ (English)

久しぶりに Haskell をセットアップしたら色々と変わっていてメモ。

stackGHCupcabal のどちらを使うべきか悩んだら参考にして欲しい。

stack 開発前の状況

Haskell のコンパイラーとして有名な ghc だが、これだけで複数のソースファイルからなる大規模プロジェクトのビルドするのは面倒である。

cabal はこのような経緯によって開発された ghc のラッパーというべきコマンドだ。 cabal は必要な他の Haskell プロジェクトをダウンロードし、ビルドしてくれる。

しかし、ダウンロードする Haskell プロジェクトの依存関係解決など、時代と共に cabal もまた面倒になってきた。

stack の登場

stack は上記のような cabal の問題点を解決するために作られた。 stack は当時の cabal の他に下記のような特徴を持っていた。

  1. 大規模プロジェクトのための豊富なオプション

  2. 依存関係の解決、著作権表記等のためのメタデータ

  3. ghc のバージョン管理

なお、初期の stack はメタデータを書くために package.yaml というファイルを使用していたが、今日では <project-name>.cabal を使用する事も可能だ。 (どちらか一方だけ書けばよい。) しかし package.yaml の規格は <project-name>.cabal に比べて更新頻度が低いように見える。 stack を使うなら、 <project-name>.cabal のみを使う事を強く推奨する。

GHCup の登場

GHCup は Haskell のセットアップツールで有り、 ghc, cabal, そして stack をインストールする。

cabal も、その後アップデートを重ねてきた。 今日では cabalstack の大きな違いは cabalghc のインストールを出来ない事くらいだ。

そして GHCup を使う場合、 cabalstack に大差はない。

結論

という分けで、Haskell をセットアップする代表的な方法として、今日では下記の 3 通りある。

  1. 直接 stack をインストールして使う

  2. GHCup 経由で stack をインストールして使う

  3. GHCup 経由で cabal をインストールして使う

この中で、私は下記のような理由により 3 の "GHCup 経由で cabal をインストールして使う" を推奨したい。

  1. GHCupstackcabal の両方を使えるようになるので、インストーラーとしては stack の上位互換のような存在である

  2. 15 年前のデファクトスタンダードだった Haskell Platform の公式ページに「 GHCup を使え」と書いてある

  3. stackcabal の違いは少ないといったが、 stack はメタデータを書く方法が 2 個存在する。これは "Don't Repeat Yourself (DRY)" の原則を犯しているのではないか?

以上 何かの参考になれば嬉しい