この記事はHaskell (その3) Advent Calendar 2017の5日目の記事です。Haskellの環境構築につまずいた経験をシェアーします。
関数型プログラミング言語の親玉Haskell。昨今の関数型ブームで学びたいと思ってる人も多いんじゃないでしょうか。 今年は『Haskellによる関数プログラミングの思考法』『Haskell 教養としての関数型プログラミング』に『Haskell入門 関数型プログラミング言語の基礎と実践』と入門書がバンバン出ています。 まさしくHaskell入門元年ですね。
というわけでこのビッグウェーブに乗じて入門しようと思ったのですが、環境構築で失敗しました。
Haskell入門 関数型プログラミング言語の基礎と実践を参考に、Stackを用いた環境構築を試みました。
StackはHaskellのビルドツール兼パッケージマネージャーのわりとなんでもいりのオールインワンツールです。2017年末現在、Haskellを開発するうえでのデファクトになっています。GHC(Haskellのコンパイラ)とcabal(パッケージマネージャー)のラッパーのような役割を果たしています。おまけにコンパイラの取得までやってくれます。
tl:dr; 日本語ユーザー名だと動かない。
まずWindowsに入れようとしたところ動作しませんでした。
- https://www.stackage.org/stack/windows-x86_64-installer からファイルをダウンロード
- インストーラーを実行、成功。
stack new my-project
でプロジェクト立ち上げる。 ←ここまで順調。stack ghci
でプロジェクトを動作させようとしたところ動作しない。
ここでだいぶつまずいて調査したところ日本語ユーザー名(ユーザー名にnon-ascii文字が含まれる)だと動かないようです。ありがちですね。 この点、上述の書籍にはユーザー名によっては動かない旨書いてあります。
日本語じゃないユーザー名作ってそっちでやる。
tl:dr; Bash on Ubuntu on Windows、遅い。
ユーザーを新規作成するのも面倒だったので、Windowsで動かないツールを動かす大本命、WSLを使うことにしました。
WSLはWindows上にLinuxのCLI環境を構築しようというBash on Linux-Distro on Windowsなサブシステムです。
Ubuntu(Linux)なのでStackのインストールもwget -qO- https://get.haskellstack.org/ | sh
で一発です。
気を取り直してWSLでStackを動作させます。はじめはstack setup
でGHCの実行形式ファイルを取ってきたり等々で若干立ち上がりが遅いですが、
これらのインストールさえ済めば、素早く動作するはずです。
stack ghci
でインタープリター起動してWelcome to Haskell World...と思ったところでが問題が起きます。
必要なファイルの準備は済んでいるのに遅い!
必要なファイルのネットワーク越しの取得はすべて済んでいるのに、ghci(Haskellの対話実行環境)やビルドが異常に遅いのです。下記の簡単なワンライナー実行するだけで6秒もかかります。
$ time stack ghc -- -e 'print "Java + You"'
"Java + You"
real 0m6.592s
user 0m0.172s
sys 0m10.938s
仮にHaskellのコンパイラが遅かったとしても(実際はほどほどに速いです)、この速度は遅すぎるということで問題がなぜ発生するのか調べてみました。
WSLのディスクアクセスが遅い。WSLはディスクアクセスが遅いために一部のプログラムの動作が異常に遅いらしいです。
今回取り上げたstack
の他にはtar
、npm
、yarn
あたりもがっつり遅いっぽいです。面倒なので試していません。
stackを利用していてWSLが遅い問題を回避するには、ghcを--disable-large-address-space
でビルドするという回避方法があります。
これはGHCのアドレス空間を1TB(巨大ですね)とる設定を無効にするビルドオプションです。ディスクアクセスが遅いならデカすぎるアドレス空間を制限すればなんとかなるだろうということでしょう。
これで問題は解決しますが、せっかくコンパイラまで持ってきてくれるオールインワンツールを使っているのに、わざわざ自前で再度コンパイラをコンパイルするのはちょっとダルいです。今回はこの回避方法は見送り、WSLでStackを動作させるのはあきらめて新しくユーザーを作成してWindows上で試しました。
- Haskellのビルドツール的なStackが今最高にナウい
- 日本語ユーザー名だとStack使えない
- WSLだとStackが遅くて使い物にならない
- 回避策はあるけどダルい
試行錯誤の末、無事にStackを使えるようになってからは楽しくHaskell入門しました。型の読み方がわかるとグッと面白くなりますね。
上級者向けの内容ではありませんが、Haskellの環境構築でコケてる人の参考になれば幸いです。
- Haskell入門 関数型プログラミング言語の基礎と実践
- 面白いので買いましょう。ダイレクトマーケティング。特にちゃんとHaskellでアプリケーションが作れる終盤がおすすめです。
stack ghc
painfully slow- Haskellが遅すぎる件の該当Issueです。NTFSの速度上げりゃーどうにかなるかもねとか言ってて厳しいです。
- 解決方法としてあげたやつの元ネタもこのIssueのコメントです。 microsoft/WSL#1671 (comment)
手前味噌ですがこちらの記事で触れているように、バッチファイルでstack.exeをラップするという方法はいかがでしょうか?
(ちなみに、このセクションが書けたのはHaskell入門のレビューをしているときに問題のIssueを目にしていたおかげです!ありがとうございます! 😏 )