HaskellやっていくGHC8.8.1令和元年白露の候
GHC 8.8.1 が出たので雑に環境を整えていきます。
OS: Ubuntu 18.04 LTS on VirtualBox on Windows
GHC, Cabal
最近は ghcup で入れている。
$ ghcup upgrade $ ghcup list --tool all $ ghcup install 8.8 $ ghcup install-cabal latest
~/.ghcup/bin と ~/.cabal/bin にPATHが通っていない場合は通しておく。
stack は手になじまない感じがして最近使っていない。 stack のいいところとしてスクリプトが書けるというのがあったが、最近は cabal でもいい感じに shebang を書けばスクリプティングできるようになったというのもある。
Haskellツール
使いそうなHaskellツールをインストールする。
$ cabal new-update $ cabal new-install doctest hlint ghcid fast-tags --installdir=$HOME/.cabal/bin
まだ GHC 8.8.1 が世に出て日が浅いのでインストールできないパッケージも多い。 自分が試した時点では以下のものはインストールできなかった。
- apply-refact
- hasktags
- stylish-haskell
- hhp (HEADでは対応済みだがhackageに上がっていない?)
- haskell-ide-engine (rc版は出ている?)
ツールによってはわざわざGHC8.8.1でインストールする必要がないものもある。
そういうものは ghcup set
でGHCを切り替えてインストールするといいかもしれない(試してはいない)。
エディタ
モーダルでカスタマイザブルなエディタがいいので Spacemacs を使う。 おそらく Emacs 26 が必要になるが素の apt だと入らないかもしれない。 そのときは apt repository を追加するなどする。 あと Spacemacs は master がだいぶ古くて皆 develop を使っているようなので自分もそうしている。
自分の.spacemacs: https://gist.github.com/syocy/5ea4d65f3f819a2a2e82e3f8ff2f3d82
シェルは fish シェルを使っているが、そのせいか Spacemacs がうまくPATHを継承しないことがあった。
そのときは SPC f e e
で環境設定ファイルを開いて直接編集すればいいようだ。
Haskell layer
の補完バックエンドは company-ghci を使っている。
dante は自分の環境では動かなかった(戦いの爪痕が.spacemacsに残っている)。
company-ghci は SPC m s b
で ghci をロードしておかないと動作しないので注意。
インタラクティブなエラーチェックは Haskell layer に含まれる flycheck-haskell を使っている。 ghci のほか、hlint があるとそれも走らせてくれる。 タイル型ウィンドウマネージャ(i3wm)を使っていた頃は ghcid を使っていた。 flycheck-haskell を使っていくうちに不都合があれば戻るかもしれない。
そのほか細かい設定は .spacemacs を見てほしい。
サンプルプロジェクト
cabal init が最近強化されたらしく、プロジェクトを作るのがより楽になったようだ。
cabal init --help
を見るとオプションが増えている。
たとえばテストのあるライブラリとしてプロジェクトを作るには以下のようにする。
$ cabal init --lib --source-dir=src --tests --test-dir=test -p sample-project
ちなみに冒頭の画像を再現するには、
SPC e L
で flycheck のエラーウィンドウを開くSPC f t
(SPC p t
) で treemacs ウィンドウを開くSPC w
でウィンドウをお好みで配置する
などすればできる。
なおウィンドウレイアウトの保存は SPC l
でできる(昔の eyebrowse layer?)。
以上、GHC 8.8.1 でも Haskell やっていくぞ。
追記: Cabal 3.0 から一部オプションのデフォルト値が変わった関係で flycheck-haskell や doctest のようなツールが動作しないということがあった。そういうときは cabal のオプションに --write-ghc-environment-files=ghc8.4.4+
を指定するとよい。 stackoverflow にもその旨を書いた。