🐡

Haskellプログラミング環境の一例

2024/06/14に公開

はじめに

この記事は、筆者の Haskell プログラミング環境を紹介するものです。選択はすべて、筆者の好みによるもので、善し悪しは判断していません。とはいえ、なれない人の参考にはなるかもしれないので記事にしました。

プロジェクト作成から作成した実行ファイル起動まで

以下のような進め方をするための環境です。

$ stack new sample             # sample プロジェクトの開発ディレクトリを構成
$ cd sample                    # sample のトップに移動
$ gen-hie > hie.yaml           # hie.yamlの生成
$ git add .; git commit        # 初期状態をローカルリポジトリにコミット
$ code .                       # VS Code を起動し、package.yaml を編集
$ git diff
 executables:
+  first:
+    main:                 Main.hs
+    source-dirs:          app/first
+    ghc-options:
+    - -rtsopts
+    dependencies:
+    - sample
+
   sample-exe:
...
$ mkdir app/first              # app/first ディレクトリを生成
$ cp app/Main.hs app/first/    # app/Main.hs を app/first/ にコピー
$ stack build                  # sample.cabal を更新
$ gen-hie > hie.yaml           # hie.yaml を更新
$ code .                       # VS Code を起動し app/first/Main.hs を編集
$ stack build sample:exe:first # first をビルド(~/.ghcup/bin/stack)
$ stack exec -- first          # first を起動

プロジェクトディレクトリ

stack new sample 直後

$ tree sample
sample
├── CHANGELOG.md
├── LICENSE
├── README.md
├── Setup.hs
├── app
│   └── Main.hs
├── package.yaml
├── sample.cabal
├── src
│   └── Lib.hs
├── stack.yaml
└── test
    └── Spec.hs

3 directories, 10 files

stack exec -- first 直後

sample
├── CHANGELOG.md
├── LICENSE
├── README.md
├── Setup.hs
├── app
│   ├── Main.hs
│   └── first
│       └── Main.hs
├── hie.yaml
├── package.yaml
├── sample.cabal
├── src
│   └── Lib.hs
├── stack.yaml
├── stack.yaml.lock
└── test
    └── Spec.hs

4 directories, 13 files

プログラミング環境概要

この記事執筆時点(2024-06-14)で筆者のプログラミング環境は以下のようになっています。
すべて GHCup でインストールしたものです。

  • GHCup: 0.1.22.0 (latest,recommended)
  • Stack: 2.15.7 (latest)
  • HLS: 2.8.0.0 (latest)
  • cabal: 3.10.3.0 (latest,recommended)
  • GHC: 9.6.5 (hls-powered)


ghcup tui

GHCバージョンの選択

GHCのバージョンは以下の条件で最新のものを選択しています。

  • Stackage の LTS に含まれていること
  • HLS のサポートがあること

上の条件は、最新のStackageのLTSと最新のHLSを選択すれば、たいていの場合、満たされますが、タイミングによってはどちらかを最新ではないバージョンにしなければならないこともあります。

implicit-hie パッケージ

HLS は hie.yaml の情報を利用します。hie.yaml が適切に設定されていないと HLS のサポートが適切に受けられません。.cabal ファイルの情報などを元に hie.yaml を生成してくれるのが implicit-hie パッケージに含まれる gen-hie コマンドです。

Discussion