March 20, 2023
Haskell セットアップ (English)¶
久しぶりに Haskell をセットアップしたら色々と変わっていてメモ。
stack や GHCup 、 cabal のどちらを使うべきか悩んだら参考にして欲しい。
stack 開発前の状況¶
Haskell のコンパイラーとして有名な ghc だが、これだけで複数のソースファイルからなる大規模プロジェクトのビルドするのは面倒である。
cabal はこのような経緯によって開発された ghc のラッパーというべきコマンドだ。 cabal は必要な他の Haskell プロジェクトをダウンロードし、ビルドしてくれる。
しかし、ダウンロードする Haskell プロジェクトの依存関係解決など、時代と共に cabal もまた面倒になってきた。
stack の登場¶
stack は上記のような cabal の問題点を解決するために作られた。 stack は当時の cabal の他に下記のような特徴を持っていた。
大規模プロジェクトのための豊富なオプション
依存関係の解決、著作権表記等のためのメタデータ
ghc のバージョン管理
なお、初期の stack はメタデータを書くために package.yaml というファイルを使用していたが、今日では <project-name>.cabal を使用する事も可能だ。 (どちらか一方だけ書けばよい。) しかし package.yaml の規格は <project-name>.cabal に比べて更新頻度が低いように見える。 stack を使うなら、 <project-name>.cabal のみを使う事を強く推奨する。
GHCup の登場¶
GHCup は Haskell のセットアップツールで有り、 ghc, cabal, そして stack をインストールする。
cabal も、その後アップデートを重ねてきた。 今日では cabal と stack の大きな違いは cabal は ghc のインストールを出来ない事くらいだ。
そして GHCup を使う場合、 cabal と stack に大差はない。
結論¶
という分けで、Haskell をセットアップする代表的な方法として、今日では下記の 3 通りある。
直接 stack をインストールして使う
GHCup 経由で stack をインストールして使う
GHCup 経由で cabal をインストールして使う
この中で、私は下記のような理由により 3 の "GHCup 経由で cabal をインストールして使う" を推奨したい。
GHCup は stack と cabal の両方を使えるようになるので、インストーラーとしては stack の上位互換のような存在である
15 年前のデファクトスタンダードだった Haskell Platform の公式ページに「 GHCup を使え」と書いてある
stack と cabal の違いは少ないといったが、 stack はメタデータを書く方法が 2 個存在する。これは "Don't Repeat Yourself (DRY)" の原則を犯しているのではないか?
以上 何かの参考になれば嬉しい