Qiitaを漁っていたらちょうど似たようなトピックで記事を書いている方がいました:
stylish-haskellとhaskell-src-extsとGHC拡張について
stylish-haskellはhaskell-src-extsというライブラリを使ってHaskellのソースコードをパースしていますが、haskell-src-extsは最新のGHC拡張に対応していません。その結果、最新のGHC拡張を使ったコードにstylish-haskellを適用しようとすると失敗します。筆者が気になったのはHexFloatLiteralsとNumericUnderscoresです。
brittanyなどの、GHCを使ってHaskellコードをパースするフォーマッターに乗り換えるのも一つの手です。しかし、フォーマッターの好みなどの問題から、ここではあくまでstylish-haskellを使いたいものとします。
長期的には、stylish-haskellがGHCを使ってHaskellコードをパースするように望ましいと思います。実際、GitHubにはそういうIssueがあって、作者も前向きです:
ですが、これは今すぐに実現する話ではないので、短期的にはhaskell-src-extsをいじって新しいGHC拡張に対応させるのが早いでしょう。
「haskell-src-extsをいじって」と書きましたが、HexFloatLiteralsとNumericUnderscoresについてはすでに有志が実装してPRを送っています。ここでは、そのPRを取り込んだhaskell-src-extsを利用してstylish-haskellをビルドします。
haskell-src-extsをHexFloatLiteralsとNumericUnderscoresに対応させるPR:
手順
まず、stylish-haskellを適当なディレクトリにチェックアウトします。
$ git clone https://github.com/jaspervdj/stylish-haskell.git
$ cd stylish-haskell
stack.yamlを開き、extra-depsの haskell-src-exts
への言及をコメントアウトし、代わりにgitリポジトリのURLとコミットのハッシュを書き加えます。このハッシュは、上記のPRのものです。
resolver: lts-15.6
packages:
- '.'
extra-deps:
# - 'haskell-src-exts-1.23.0'
- git: https://github.com/merc1031/haskell-src-exts.git
commit: 2376655f889d170e16b9836b2ae1147f6a074caa
出来合いのPRではなく、自前で改変したhaskell-src-extsを使いたい場合は、extra-depsを消してpackagesの部分にローカルのディレクトリを指定すれば良いはずです(未検証):
packages:
- '.'
- '../haskell-src-exts'
あとは stack install
すればHexFloatLiteralsとNumericUnderscoresに対応した stylish-haskell
が ~/.local/bin
にコピーされます。