なんもわからんな

Haskellをやりたい

明けましておめでとうございます。
突然ですが僕はHaskerllをやりたい。理由は下記の動画やTAPLを読み始めたから。

youtu.be

Language Server導入

僕は形から入るタイプなので、vimで.hsを弄れるようにする。
vimでの補完は全てLanguage serverを使っているようにしているので、haskellのlsを調べたところ以下のようなリポジトリが見つかった。

github.com

何もhaskell分からないが stackでコンパイラやpackageの管理をすれば良いというのだけ確認し、stackを導入した。

$ brew install stack

次にhaskell-ide-engineを導入するために、ビルドする。

$ stack ./install.hs stack-install-cabal
$ stack ./install.hs hie-8.6.5
$ stack ./install.hs build-data

ビルドするときに私の場合下記のようなエラーが発生した。

$ stack ./install.hs stack-install-cabal
Linking /Users/TrsNium/.stack/setup-exe-cache/x86_64-osx/tmp-Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5 ...
ld64.lld: warning: ignoring unknown argument: --gc-sections
ld64.lld: warning: ignoring unknown argument: -u

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ld64.lld: warning: ignoring unknown argument: -u
ld64.lld: warning: ignoring unknown argument: -u
ld64.lld: warning: ignoring unknown argument: -u
ld64.lld: warning: ignoring unknown argument: -search_paths_first
ld64.lld: warning: ignoring unknown argument: -dead_strip_dylibs
ld64.lld: warning: -sdk_version is required when emitting min version load command.  Setting sdk version to match provided min version
Cannot open /Users/TrsNium/.stack/setup-exe-src/setup-mPHDZzAJ.o: bad relocation (Invalid pointer diff) in section __TEXT/__text (r1_address=21c, r1_type=5, r1_extern=1, r1_length=2, r1_pcrel=0, r1_symbolnum=37), (r2_address=21c, r2_type=0, r2_extern=1, r2_length=2, r2_pcrel=0, r2_symbolnum=30)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`clang' failed in phase `Linker'. (Exit code: 1)

--  While building simple Setup.hs using:
      /Users/TrsNium/.stack/programs/x86_64-osx/ghc-8.6.5/bin/ghc-8.6.5 -rtsopts -threaded -clear-package-db -global-package-db -hide-all-packages -package base -main-is StackSetupShim.mainOverride -package Cabal-2.4.0.1 /Users/TrsNium/.stack/setup-exe-src/setup-mPHDZzAJ.hs /Users/TrsNium/.stack/setup-exe-src/setup-shim-mPHDZzAJ.hs -o /Users/TrsNium/.stack/setup-exe-cache/x86_64-osx/tmp-Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5
    Process exited with code: ExitFailure 1

これはghcコンパイラのオプションがgcc向けの設定になっているようだった。 以下を参考にし ~/.stack/programs/x86_64-osx/ghc-8.6.5/lib/ghc-8.6.5/settings 辺りの設定を良しなに変えた。

github.com

ビルドされたパッケージー$HOME/.local/bin に生成されるらしいので、pathを通しておく。 試しにビルドされたhaskell-ide-engineを実行してみる。

$ hie-wrapper
2020-01-05 01:44:54.574095 [ThreadId 4] - run entered for hie-wrapper(hie-wrapper) Version 1.0.0.0, Git revision b7ce8b8f2fc4a071db2119516aa1dcffc577dca0 (3541 commits) x86_64 ghc-8.6.5
2020-01-05 01:44:54.57757 [ThreadId 4] - Current directory:/Users/TrsNium/Documents/TrsNium/kell
2020-01-05 01:44:54.577999 [ThreadId 4] - Operating system:darwin
2020-01-05 01:44:54.57827 [ThreadId 4] - args:[]
2020-01-05 01:44:54.583853 [ThreadId 4] - Cabal-Helper dirs: ["/Users/TrsNium/Documents/TrsNium/kell","/Users/TrsNium/Documents/TrsNium/kell/File.hs"]
2020-01-05 01:44:56.725063 [ThreadId 4] - Cradle directory:/Users/TrsNium/Documents/TrsNium/kell
2020-01-05 01:44:56.725759 [ThreadId 4] - Use Stack GHC
2020-01-05 01:44:57.066709 [ThreadId 4] - Project GHC version:8.6.5
2020-01-05 01:44:57.067207 [ThreadId 4] - hie exe candidates :["hie-8.6.5","hie-8.6","hie"]
2020-01-05 01:44:57.067991 [ThreadId 4] - found hie exe at:/Users/TrsNium/.local/bin/hie-8.6.5
2020-01-05 01:44:57.068399 [ThreadId 4] - args:[]
2020-01-05 01:44:57.068593 [ThreadId 4] - launching ....



Running HIE(hie-8.6.5)
  Version 1.0.0.0, Git revision b7ce8b8f2fc4a071db2119516aa1dcffc577dca0 (3541 commits) x86_64 ghc-8.6.5
To run as a LSP server on stdio, provide the '--lsp' argument
Current directory:/Users/TrsNium/Documents/TrsNium/kell

args:[]

Looking for project config cradle...

2020-01-05 01:44:57.159521 [ThreadId 4] - Cabal-Helper dirs: ["/Users/TrsNium/Documents/TrsNium/kell","/Users/TrsNium/Documents/TrsNium/kell/File.hs"]
Cradle:Stack project
2020-01-05 01:44:58.83182 [ThreadId 4] - done

良さそう。この辺りを LanguageClient-neovim に設定していく。

[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
on_ft = ['elixir', 'python', 'ruby', 'rust', 'cpp', 'go', 'erlang', 'haskell']
rev = 'next'
build = 'source install.sh'
hook_add = '''
  set hidden
  set signcolumn=yes
  let g:LanguageClient_serverCommands = {
      \ 'python': ['pyls'],
      \ 'ruby': ['solargraph', 'stdio'],
      \ 'cpp': ['clangd'],
      \ 'go': ['bingo', '-mode', 'stdio'],
      \ 'rust': ['rustup', 'run', 'nightly', 'rls'],
      \ 'erlang': ['$HOME/erlang_ls/_build/prod/rel/erlang_ls/erlang_ls-0.0.1/bin/erlang_ls foreground'],
      \ 'elixir': ['$HOME/.config/elixir-ls/language_server.sh'],
      \ 'haskell': ['hie-wrapper', '--lsp']
      \}
  let g:LanguageClient_hasSnippetSupport = 0
  let g:neosnippet#enable_complete_done = 0
  let g:LanguageClient_rootMarkers = ['*.cabal', 'stack.yaml']
  nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
  nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR>
  nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR>
  nnoremap <leader>lm :call LanguageClient_contextMenu()<CR>
  let g:LanguageClient_loggingLevel = 'DEBUG'
  let g:LanguageClient_loggingFile =  expand('~/.local/share/nvim/LanguageClient.log')
  let g:LanguageClient_serverStderr = expand('~/.local/share/nvim/LanguageServer.log')
  let g:LanguageClient_settingsPath = expand('$XDG_CONFIG_HOME/lsp/settings.json')
  let g:LanguageClient_loadSettings = 1
'''

だいたいこんな感じ。 何も分からんが補完は効いてそう。 f:id:yakuta55:20200105014959p:plain

終わりに

去年の夏に負荷試験ツールを作っていたのですが、中途半端になってたので完成させたいなぁって思ったり。

github.com