1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HaskellプロジェクトをすぐにIDE (VSCode+Haskell Language Server) 化する

Last updated at Posted at 2022-07-19

手軽に Haskell を Visual Studio Code (w/Haskell Language Server) 環境で使いたい

昨今の Haskell 環境は GHCup をインストールするだけで手軽に VS Code + Haskell Language Server (Haskell LSP) 上での full-fledged なIDE/開発環境が手に入る. とはいえこれは Stack か Cabal といったツールでの最低限のセットアップが必要で,私のように偶にしか Haskell を触らない者にはそれすらも少々面倒である.

そこで,Haskell Stack や Cabal を使わない, ghc --make 一つでできているプロジェクトを手軽に最新の VSCode + Haskell LSP 環境でブラウズできるようにする方法を紹介する.

hie.yaml と hie-bios と Haskell LSP

VSCode の Haskell 開発環境のバックエンドである Haskell Language Server のドキュメントによれば, プロジェクトの設定を検出するのは hie-bios というコンポーネントが担当している. (hie は Haskell IDE Engine の頭文字で,Haskell Language Server の前身であったようだ.)
hie-bios の README にあるように, hie-bios は hie.yaml に設定を書けば明示的にプロジェクトの設定を Haskell Language Server に知らせることができる. その設定は Stack, Cabal のほかに Bios (より詳細な設定) と Direct がある.

hie-bios の Direct 設定

このうち Direct を使えば,手元の非 Stack・非 Cabal のプロジェクトでも平易に Haskell LSP の恩恵を得ることができる.

例えば,次のようにコンパイルされる Haskell コードを考える:

ghc --make -package mtl -package split A.hs B.hs

すなわち A.hs と B.hs からなり, mtl パッケージと split パッケージに依存するプロジェクトである.
こういったコードを VS Code で編集するには,次の内容をもつ hie.yaml をプロジェクトルートにおいて VSCode で開けばよい:

cradle:
  direct:
    arguments:
      - "-package"
      -  "mtl"
      - "-package"
      - "split"
      - "A.hs"
      - "B.hs"

必要に応じて Haskell LSP をリスタート (Ctrl-P -> Haskell と入力すれば選択肢が現れる) すれば反映される.

所感

自分でごく短いコードを試すほか,誰かから渡されたレガシーな Haskell コードを調べなければならない場合にもこの方法は有効だと思う.

とはいえこの方法はファイルが増えるたびに hie.yaml の編集が必要になる.
プロジェクトが複数のファイルから構成されるようなったら,早々に Stack か Cabal を使う方法に切り替えたほうがよさそうだ.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?