Haskell環境再構築

ここ数ヶ月、ずっとimperative programmingをしていてちょっと疲れてきたのと、今Haskellに戻ったら前よりはもう少し書ける/わかるようになっているかもしれないという期待で、あらためてHaskellに入門してみる。

環境構築

前にやっていたときは確か存在していなかったような気がするのだが、ghcupというrustup的なツールが登場していたのでさっそく入れてみる。
これはghc, cabal, haskell-language-server(HLS)のインストール・バージョン管理を行ってくれるありがたいツールで、途中2回ほどコマンド入力する場面があるので完全放置では完了まで行かないが、スムーズにインストールが可能。以前はstackを使っていたが、cabalがだいぶフレンドリーになってきているという噂を見かけたのでcabal一本でやってみようかと思っている。

鬼門・haskell-language-server

hieの頃からHaskellのLSPにはいい思い出がなく、ビルド時間が地獄のように長いとか、頑張って入れても全然動かないとかで、この辺の環境構築周りのもどかしさもあっていったん離れることに決めたのだった。今はというと、ほぼ公式のLSPであるHLSがghcupでツルッと入ってくる。これを使えばいい。

ただ、Arch Linux系のディストロを使っている人は、HLSとVS Codeのインテグレーションでおそらく引っかかるだろう。

VSCode extension not detecting Cabal/Stack due to incomplete $PATH in /etc/profile · Issue #236 · haskell/haskell-language-server

このissueで指摘されているが、Arch系の場合、.bashrcにghcupのPATHを書いてもVS Codeが認識せず、etc/profileに書かないと動かない。そして僕の場合は、etc/profileに書いた上で、(ランチャーからではなく)ターミナルからcodeとコマンドを打って起動しないとHLSが動かなかった。ここまでわかるのに半日費やしてしまった…。

(2021-05-22追記)etc/profileへの記述が間違っていた模様。以下のようにすればVS Codeでバッチリ動いてくれました。

# etc/profile
PATH=~/.ghcup/bin/:$PATH
PATH=~/.cabal/bin/:$PATH

ランチャーからの起動が実質できないのは良くないので、これを機にneovimでの編集に移行してみる。
ただしvim/neovimであっても、Arch系であればetc/profileにPATHを書かなければならないのは同じ(記入後、要再起動)。その上で、HLS公式のイントロダクションに書いてあるとおり、CocでHLSを設定すれば、動く。

久々にHaskellを書くと、頭も指も全然動かなくて逆に面白い。
以前いじっていたときには存在に気づかなかったパイプライン演算子を使って、Project Eulerの2問め。

import Data.Function

fib:: Integer -> Integer -> Integer -> Integer
fib a b count
    | count == 1 || count == 0: b
    | count >= 2: fib b (a+b) (count-1)
    | otherwise: 0

makeFib: fib 1 1

euler2FibList:: Integer -> Integer
euler2FibList n: takeWhile (\x -> makeFib x < n) [1..] & map makeFib & filter even & sum

main: print $ euler2FibList 4000000

makeFibを2回使っているのがかっこよくないですね。