歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Haskell】vim上でHaskellの構文チェックを行う

今まで完全に教養としてHaskellを勉強していた(Pythonの型注釈に必要な感覚を養いたい、内部状態の少ないコードを書きたい)のですが、「この問題はHaskellなら上手く解けるんじゃないか」というものを思いついたので、初めて自分の頭で考えたコードをHaskellで書いています。

Haskellには強力な型システムがあるので間違ったコードを書きづらいのですが、少しコードを変えるたびにコンパイルを通すのはさすがに面倒です。そのため、普段利用しているエディター(vim)から静的解析ツールを呼び出せるように設定することにします。

こちらの記事で紹介されているhaskell-vim-nowでいろいろな開発ツールが導入できるようですが、私はエディターにいろいろ設定しても結局使いこなせないので、今後必要に応じて導入しようと思います。Pythonのプログラミングでもflake8と簡単な補完以外は使ってないので…。

qiita.com

というわけで今回は次の2項目を設定しようと思います。

特にhlintは命名規則やポイントフリースタイルの有無など、「Haskellらしくないコード」を検知してくれるようなので、勉強目的でも助かりそうです。

qiita.com

stackのインストー

Haskellの現在の事実的な標準のビルドツールであるstackをインストールします。stackについてざっくり知りたい方は以下の記事を読みましょう。

qiita.com

公式サイトにもある通り、UNIX系のOSであれば

curl -sSL https://get.haskellstack.org/ | sh

または

wget -qO- https://get.haskellstack.org/ | sh

でインストールできます。

Mac OS Xではbrewでもインストールできますが、公式サイト曰く「unofficial and lag slightly behind new Stack releases」とのことなので、私はcurlを使う方法でやりました。

brew install haskell-stack

念のため、現在インストールされるバージョンも記載しておきます。

$ stack --version
Version 1.4.0, Git revision e714f1dd3fade19496d91bd6a017e435a96a6bcd (4640 commits) x86_64 hpack-0.17.0

stackでghc-modをインストールする

こちらも公式サイトの手順に従います。会社のすごい先輩は事あるごとに「ネットの記事を参考にするのも良いが、基本的には公式サイトの手順に従え。場当たり的な対処はするな」と言っているので、皆さんも私の言うことは信用せず、以下のURLに目を通してください。

github.com

今回はプロジェクトごとではなく、グローバルな環境に入れてしまいたいので、Global installationの手順に従い、以下のコマンドをホームディレクトリで実行します。同時に、hlintもインストールしてしまいましょう。

stack install ghc-mod hlint

ghc-modの公式ページではcabalを使った手順が推奨されていますが、以下の記事で「stack ghcのバージョンとghc-modをビルドしたghcが食い違ってた」とき、うまく動作しないことがあるようです。

qiita.com

素直にパスを通します。stackを使ってインストールした場合は~/.local/binghc-modのバイナリが保存されているので、~/.bash_profileに以下を追記します。

export PATH=$PATH:~/.local/bin

vimの設定

ghc-modを利用したvimプラグインは、まずコード補完を目的とするneco-ghcが開発され、その他の機能(型の自動チェックとかLintとか)はghcmod-vimで提供されているようです。

eagletmt.hateblo.jp

私はPythonのflake8(文法チェック)のような機能を期待しているので、まずは基本的にhlintを利用し、より詳しい情報が欲しい場合にghcmod-vimも一応呼び出すようにしたいと思います。コード補完も欲しくなったらneco-ghcも検討します。

私はvimプラグイン管理ツールとして設定がシンプルだというvim-plugを利用しているので、こんな感じで記述していきます。

(ghcmod-vimvimprocに依存しているようです)

let g:syntastic_haskell_checkers = ["hlint"]

call plug#begin('~/.vim/plugged')
Plug 'scrooloose/syntastic'
Plug 'Shougo/vimproc', {'do' : 'make'}
Plug 'eagletmt/ghcmod-vim'
call plug#end()

詳しい利用方法は、vim-plugの公式サイトを読んでください。

使ってみる

Haskell で hlint を使用したコードチェック - C++でゲームプログラミング」のHaskellコードをvimで保存すると、hlintがコードの悪い部分と行を教えてくれます。

f:id:takeshi0406:20170514232251p:plain

また、:GhcModCheckコマンドを実行すると、ghcmod-vimコンパイラのエラーや警告を表示します。

f:id:takeshi0406:20170514232724p:plain

他にもいろいろできそうですが、とりあえずこれくらいで。

Haskellについて余談

ちょっとした余談ですが、もしインターネット上の資料でHaskellを学びたいという人はHaskell Day 2016チュートリアルから追うことをおすすめします。 他の情報源から追うと、古い情報があったり、Haskell経験者じゃないと難しい表現などが多く、情報の取捨選択が難しいと思います。

現在の事実的標準のビルドツールであるstackの説明なども詳しく、「ちょっと勉強したいだけなのに開発環境を整えるところで詰まってる」ような状況にはハマりにくくなると思います。

qiita.com

Haskellのコードを書く感覚をつかむには『すごいHaskellたのしく学ぼう!』がおすすめです。(その分、開発環境などの情報は古いです)

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

あと、こちらの本も「すごく分厚いけど、関数型言語を学ぶのに必要な感覚を丁寧に説明していて良かった」「すごいHaskellは、必要な概念の定義→利用例という説明が多くて『ちょっと待って!』と思うことが多かったけど、この本では無かった」ととある友だちから評判が良かったです(私はまだ読んでませんが…)。

Haskell 教養としての関数型プログラミング

Haskell 教養としての関数型プログラミング

表紙の「Haskellの美しさを知っている人は、人生に絶望することはない。Haskellで世界を変えたい。」という文言の威圧感がヤバいです。

また、日本HaskellユーザーグループのSlackも開放されています。私もROM専で登録してみましたが、Haskellの議論が日本語で読める貴重な場だと感じています。

haskell.jp