PC-asobi

Feb 28, 2019 - 1 minute read - Comments

Arch LinuxでHaskellをはじめる

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のソースファイルを開き、設定したlk などを試します。
うまく動作しているようです。

しかし、何も編集していない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が参照できていないようです。
原因を調べてみましたが、解決できませんでした。

もう少し原因を調べてみます。