関数型プログラミング
スタイル
関数が第一級
イミュータブルなデータ構造
副作用ではなく作用
用語
純粋関数
参照透過な引数による呼び出しが参照透過になる関数
式と式を評価した結果である値を置き換えても常に結果が同じである
関数が純粋でない例
(() => { console.log("Hello"); return 0 })()
常に同じ結果 0 を得られますが、この式を0と置き換えると何も標準出力されなくなり振る舞いが変わるので置き換えられない
純粋関数型プログラミング言語
全ての関数が参照透過性を持つような言語
Haskellなど
副作用
関数が値を返すこと以外に引き起こすこと
なぜ副作用を避けるべきか?
副作用はプログラムの振る舞いについての論証を難しくするため
逆に置換モデルの論証は単純である
代入→イミュータブル
入出力→IOモナド
変数を変更する
データ構造を直接変更する
オブジェクのフィールドを設定する
例外をスローする、またはエラーで停止する
コンソールに出力する、またはユーザー入力を読み取る
ファイルを読み取る、ファイルに書き込む
画面上に描画する
式と文
純粋な関数型プログラミングでは文は全く使われない
文はコンピュータにコンピュータへの動作指示なので結果は値にならない→参照透過や合成可能のような良い性質を持たない
参照透過
式が参照透過であるとは、どのようなプログラムにおいても、プログラムの意味を変えることなく、式をその結果に置き換えることができる
例えば+を数字に適応した時
2+3
の結果は常に5になる
2+3の式を5に置き換えてもプログラムの意味は変わらないので上の式は参照透過であると言える