関数 !
手続型プログラミングにおける関数ではないint main(void) {! puts("Hello, World!");! return 0;!}
数学でいう関数 !
入力 x に対して出力 y のただ一つの値を決定する規則が与えられているときにy を x の関数という !
y = f(x)
関数型言語 !
関数型プログラミングに向いた特徴をもつプログラミング言語 関数型プログラミング言語 !
共通定義はない
関数型プログラミング !
「計算とは関数を引数に適用すること」だというプログラミング手法
関数型プログラミングの必要条件 1 !
第一級関数 (first-class function) を扱えること
第一級関数 !
関数を第一級オブジェクトとして扱うことができる関数 関数リテラルとも
第一級オブジェクト !
あるプログラミング言語において、生成、代入、演算、(引数、戻り値としての) 受け渡しといった、その言語における基本的な操作を制限なしに利用できる対象のこと
第一級関数 !
プログラムの実行時に生成され、データ構造に含めることができ、他の関数の引数として渡したり、戻り値として返したりすることのできる関数
高階関数 !
関数を引数にしたり、戻り値にしたりする関数 function each(array, f) {! for (var i = 0; i < array.length; i++) {! f(array[i]);! }!}
第一級関数 !
理論モデルはλ計算 !
f(x) = x + 1!λx.x+1!f(3) = (λx.x+1) 3!!
なぜλ計算? !
関数 x + 1 を引数 5 に適用!関数 x + y を引数 3 に適用!関数 f(x) を引数 7 に適用!!
λx.x+a を引数 1 に適用!
関数型プログラミングの必要条件 2 !
参照透過性 (Referential Transparency) が常に保たれること
参照透過性 !
文脈によらず式の値はその構成要素 (変数や関数など) によってのみ定まること
変数の値は最初に定義した値と常に同じ 関数は同じ値を引数として与えられれば常に同じ値を返す
変数への破壊的代入をしない すべての式や関数は副作用を持たない
副作用 !
•モナド (Monad) •純粋性にこだわらず副作用を許容 •ただし、必要最低限にとどめ、局所化する
破壊的代入 !
•必要になったら新しい値を作る •変数は定義するだけ、(再) 代入はしない
破壊的代入 !
•ループはどうするの? •再帰
• 漸化式: an+1 = p an + q!• i = i + 1 に違和感を覚えませんでしたか?
参照透過性 •ユニットテスト書きやすい •並列処理に向いている !
第一級関数 •コードが簡潔に •関数を共通化しやすい
val l = List(4, 1, 3, 2)!l.filter(_ % 2 == 0).sortWith(_ < _)
リストの要素から偶数を取り出し、昇順にソート
例えば Java だと?
木虎 直樹 @kitora_naoki
プログラマ & インフラエンジニア
Java, Scala, JavaScript, Python Linux, Web, AP, RDBMS, MTA, DNS, network アジャイルサムライ読書会 大阪道場主催