関数型言語

関数型言語とは

オブジェクト指向と関数型プログラミングの違い

  • データと振る舞いをどう扱うか

  • 副作用があるか

関数型にするには

  • データと振る舞いを分離させる

  • 外部に依存しないよう関数の入出力を定める

  • 再帰やイテレーションメソッドを使い、副作用を取り除く

http://qiita.com/stkdev/items/5c021d4e5d54d56b927c

参照透過性

同じ関数であれば、いつ実行しても結果が同じであること。

引数が同じなら戻り値は、必ず同じであるということです

副作用がない

global変数の使用などによる状態の変化がないこと

ファイルのI/Oやデータベースも状態の変化に含まれてしまいますが、そこは局所化してなるべく切り分けましょう

関数型に書き換えるためのステップ

  1. 状態(変数)と振る舞いを切り離す

  2. ループではなくmapやreduceを使う

  3. 振る舞いを副作用のない関数にバラす

わかりやすい解説サイト

http://pg-kura.hatenablog.com/entry/20111114/1321236695

いつ関数型プログラミングか

以下の様な兆候を感じたら、あなたはそのプログラムを関数型プログラミングで書くべきです。

"人工物"クラスが増えてきた。

Builderパターン、Strategyパターン、Commandパターン、Interpreterパターンが増えてきた。

DI注入のとき、コンストラクタ注入にするか、セッター注入にするか、いつも迷う。