Posted at

Haskellを始めてみた


動機

前Qiitaのトレンドに上がっていたLazy K プログラムを書くから関数型言語に興味を持ったのが発端でした。

コンビネータ計算に興味を持ち、そこからSKI記法不動点コンビネータラムダ計算等を渡り読んで楽しくなったので関数型言語を学ぼうと思いました。

ちなみになぜhaskellを選んだかというと、ただ単に勧められたからです。


macで環境構築をする

今現在、Haskellをインストールする際に推奨されているのはstackを使う方法のようです。


stackをインストールする(homebrew)

homebrewでstackをインストールします

$ brew install haskell-stack


HIE(haskell Ide Engine)をインストールする

HIEはhaskell用のLanguage Serverです。(language serverについては → langserver.org)

HIEはhomebrewではシステム上インストールできないため、個別にGithubレポジトリから作成してインストールします。

$ git clone https://github.com/haskell/haskell-ide-engine.git

$ cd haskell-ide-engine
$ stack ./install.hs hie-8.6.4
$ stack ./install.hs build-doc-8.6.4

これで実行可能ファイルが~/.local/bin/以下に作成されるので、~/.local/binPATHに追加すれば使用することができます。


HIEをvim-lspと連携する

私はvimmerなので、vim-lspと連携させて使います。

以下の設定をvimrcに追加します。

以下は自分の他の言語用の設定をそのまま写して使っているものです。

誤りもあるかもしれませんが一応使えています。

augroup MyLsp

autocmd FileType haskell setlocal omnifunc=lsp#complete

if executable('hie')
au User lsp_setup call lsp#register_server({
\ 'name': 'hie',
\ 'cmd': {server_info->['hie']},
\ 'whitelist': ['haskell'],
\ })
endif

au FileType haskell nmap <leader>R <plug>(lsp-rename)
au FileType haskell nmap <leader>D <plug>(lsp-definition)
au FileType haskell nmap <leader>r <plug>(lsp-references)
au FileType haskell nmap <leader>d <plug>(lsp-document-symbol)
au FileType haskell nmap <leader>w <plug>(lsp-workspace-symbol)
augroup end


HIEをale.vimと連携する

補完等のLanguage server周りはvim-lspに任せているものの、lint等はaleに任せているのでaleの設定もします。

let g:ale_linters = { 'haskell': ['hie'], }


学習資料について

本来なら、公式のチュートリアルをやるのが良いと思うのですが、英語でとっかかりづらかったのでHaskell 超入門シリーズを使っています。

書籍は今は何も使っていません。