Stack を使って Haskell をインストールする

  • 24
    いいね
  • 0
    コメント

Haskell 開発環境のインストールは、以前は Haskell Platform を使うのが定番でしたが、現在は Stack を使うのが定番となっています。

この記事では、Stack をインストールした後で(Stack 自体のインストールはプラットフォームごとに異なりますので Stack のページを参照してください)、実際に Haskell 開発環境をどのように整えるか書きます。

Stack を使って Haskell 開発環境をインストールする操作手順

Stack のインストール直後はまだ GHC が使えません。Stack で GHC のインストールを行うには次のようにします。

方法 1 : プロジェクトを新規作成して GHC を使う

Stack のページを見ると、まず stack new でプロジェクトを作成し、そのディレクトリに入って stack setup を実行せよ、と書いてあります。

その通りに実行すると、GHC がまだダウンロードされていなければダウンロードされ、インストールが行われます。インストールが終わると、プロジェクトディレクトリの内側で、stack ghc コマンドで GHC を使うことができるようになります。

方法 2 : プロジェクトを新規作成せずに GHC を使う

前述の方法ではプロジェクトを作成することが前提となっています。しかし、プロジェクトを作成せずに GHC を使うことも可能です。そのためには、プロジェクトディレクトリの外側で stack setup を実行します。

すると、同様に GHC のインストールが行われます。これで、どのディレクトリにいても stack ghc で GHC を使うことができるようになります。

Haskell 開発環境がインストールされる場所

上記の方法で、どちらも ghc というコマンドが PATH が通った場所にインストールされたわけではありません。実際に GHC がインストールされるのは、~/.stack ディレクトリ以下です。これを stack ghc と、stack コマンド経由で実行します。

プロジェクトを作成する場合としない場合の違い

stack new でプロジェクトを作成すると、そのプロジェクトで使う Haskell 開発環境のバージョンなどの情報が書かれた stack.yaml ファイルがプロジェクト内に生成されます。stack setup は、stack.yaml に記述された内容をもとに GHC のインストールを行います。

プロジェクトの外側で stack setup を実行した場合は、~/.stack/global-project/stack.yaml に記述された内容をもとに GHC のインストールを行います。つまり、個々のプロジェクトの設定の代わりに、グローバルプロジェクトという特殊なプロジェクトの設定が使われることになります。

Haskell 開発環境のバージョン

最初に stack.yaml ファイルが生成されるときに、Haskell 開発環境のバージョンが stack.yaml に書かれます。resolver: lts-5.18 などと書かれている行がそれです。stack setup は、そこに記載されたバージョンの Haskell 開発環境を使えるようにします。

Haskell 開発環境のバージョンを変更したい場合は、stack.yamlresolver の行を書き換えてから stack setup を実行します。

グローバルプロジェクトを使う場合、最初に生成された ~/.stack/global-project/stack.yaml の設定を使い続けることになります。そのため、グローバルプロジェクトで新しい Haskell 開発環境に更新したい場合は ~/.stack/global-project/stack.yamlresolver の行を書き換えてから stack setup を実行します。

resolver の行に記載するバージョンですが、最新バージョンは LTS Haskell のページを見ると分かります。また、使用可能なバージョンの一覧は lts-haskell: LTS Haskell build plans のページを見ると分かります。

もっと簡単に GHC を呼び出したい

毎回 stack ghc というコマンドで GHC を使うのは少々面倒です。シェルでエイリアスを定義しておくのが楽かと思います。bash や zsh の場合は、~/.bashrc~/.zshrc に以下のように定義しておくと良いです。

alias ghc="stack ghc --"
alias ghci="stack ghc -- --interactive"
alias runghc="stack runghc --"

まとめ

Haskell 開発環境を整えるには Stack を使えばいいという話はあるものの、実際にどのように整えるのかがどうもはっきりしないと感じていたのでまとめました。ツッコミ歓迎です。