Haskellは汎用の純関数型プログラミング言語です。
これまで入門書を読んだ程度で、あまりコードを書いたことがありませんでしたが、 最近また興味が出てきたので、Haskellを使ってなにかコードを書いていきたいと思います。
ひとまず今回は、Haskellの環境構築を行います。
ArchWikiでHaskellのページをみると、パッケージ管理の方法がいくつかあるようです。
依存関係でハマりたくないので、そのリスクが低そうなstackを選択することにしました。
stackは公式リポジトリに登録されているので、簡単にインストールできそうです。
$ sudo pacman -S stack
これでstackのインストールが完了しました。
ghcも一緒にインストールされるので、基本的なインストールはこれで完了してしまいました。
次に、私はneovimを使っているので、neovimでHaskellを書くための設定を行います。
以前にHaskellを触ったときはghc-mod, deoplete, neco-ghcでコード補完していましたが、
いま見るとghc-modがdeprecatedになっているようです。
新しく環境を作る場合、haskell-ide-engineを使うのが良さそうなので、
LanguageClient-neovimとhaskell-ide-engineをインストールすることにしました。
まず、haskell-ide-engineをインストールします。
$ git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
$ cd haskell-ide-engine
$ make hie-8.6.3
$ make build-doc-8.6.3
かなり時間がかかりますが、無事インストールできました。 容量もかなり食ってそうなので、ディスクの空き容量が少ない状態では実行しないほうが いいかもしれません。
続いて、LanguageClient-neovimの設定を行います。readmeのINSTALLの通りに進めます。
deinユーザーなので、deinからインストールを行います。
init.vimに次のように記述します。
call dein#add('autozimu/LanguageClient-neovim', {
\ 'rev': 'next',
\ 'build': 'bash install.sh',
\ })
そしてneovimを再起動し、次のコマンドを実行します。
:call dein#install()
これでインストールは完了しました。
キーマップの設定が必要なので、haskell-ide-engineのreadmeを参考に設定します。
let g:LanguageClient_serverCommands = { 'haskell': ['hie-wrapper'] }
let g:LanguageClient_rootMakers = ['*.cabal', 'stack.yaml']
nnoremap <F5> :call LanguageClient_contextMenu()<CR>
map <Leader>lk :call LanguageClient#textDocument_hover()<CR>
map <Leader>lg :call LanguageClient#textDocument_definition()<CR>
map <Leader>lr :call LanguageClient#textDocument_rename()<CR>
map <Leader>lf :call LanguageClient#textDocument_formatting()<CR>
map <Leader>lb :call LanguageClient#textDocument_references()<CR>
map <Leader>la :call LanguageClient#textDocument_codeAction()<CR>
map <Leader>ls :call LanguageClient#textDocument_documentSymbol()<CR>
これですべての準備が整いました。
動作確認をします。
$ stack new hello
$ cd hello
stackでプロジェクトを作成して、そのディレクトリに移動します。
$ nvim src/Lib.hs
neovimでHaskellのソースファイルを開き、設定した
うまく動作しているようです。
しかし、何も編集していないLib.hsにエラーが表示されています。
Could not find module ‘Prelude’ There are files missing in the ‘base-4.12.0.0’ package, try running 'ghc-pkg check'. Use -v to
see a list of the files searched for. |1 | module Lib | ^^^
Preludeが参照できていないようです。
原因を調べてみましたが、解決できませんでした。
もう少し原因を調べてみます。