なぜHaskellを学ぶか・使うか
Yuji Yamamoto (山本悠滋)
2018-11-28
はじめまして! (^-^)
- 山本悠滋 (@igrep)
- Haskell歴 ≒ プリキュアおじさん歴 ≒ 約6年。
- 前職はGMOフィナンシャルHDにてFXのシステムを作ったり
- 大量の設定ファイルを書き換えるのに、Haskellでパーサーを書いてみたりしてました。
- 後は、自前でソフトウェアを入れづらいWindows環境で動くexeファイルをビルドしたり
今日は
ひとまず環境整備 + mmlhのインストール
インストールを待っている間に…
なぜHaskellを学ぶか・使うか
Haskellといえば?
個人的にははどちらかというと
- 静的型であること
- 副作用チェッカーがあること
- 関数型プログラミング(しやすい)こと
- という説明の方がしっくりくる!
関数型言語?
- 「関数型言語」という言葉はそもそも定義が曖昧
- 今や「関数型言語」じゃないとされる言語にも、それっぽい機能がたくさん
- 「あの言語はオブジェクト指向だから私は関数型を知らない」と卑屈になる必要はない
- あくまでそうした機能を使うか
関数型言語?
- 結果、なんだか近寄りがたいイメージだけができてしまった?
関数型プログラミング?
- それでも、高階関数組み合わせたり、イミュータブルなデータ構造を駆使してプログラムを作るのを支援する仕様においては世界トップクラス。
- 「関数型言語」とは言わずに「関数型プログラミングしやすい」と言おう。
- 「関数型プログラミングしやすさ」の差が昔よりも曖昧になった。
純粋?
- 「純粋関数型言語」というと関数型プログラミングしか出来ないように聞こえる
- 実際には(少なくとも体感的には)手続き型プログラミングを普通に行う
- Rustのborrowチェッカーならぬ「副作用チェッカー」があると考えた方が自然
副作用チェッカー?
- 入出力処理とか
- スレッドの生成とか
- 例外の catch/throw とか
- 書き換え可能な参照の読み書きとか
- これらの処理すべてに
IO
というラベルっぽいものを付け、純粋な関数と一緒に使えないようにしている
- 一緒に使うと型エラーになる。静的型付け言語ならでは!
- ※デバッグ時に使う例外はあります
副作用チェッカー?
さらに高度な機能を使うと
- この型の関数は、ブロックで共有している変数を書き換えることが出来る
(State monad)
- この型の関数は、メモリの書き換えのみができる (ST monad)
- この型の関数は、その両方が出来る (StateT ST monad)
- みたいな使い分けが出来る。
副作用チェッカーのおかげで
- 関数が及ぼす影響範囲を型を見ただけで知ることが出来る
数学?
- 数学からそのまま持ってきた用語があるのは事実
- だからといって、知らないといけないわけじゃない
- 特にMonadとか、「プログラミングのためのMonad」として、個別のMonadの使い方を理解する必要がある