関数型って?
第一回 関数型言語勉強会 大阪

     2012-05-19
関数

!

手続型プログラミングにおける関数
ではない
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


アジャイルサムライ読書会 大阪道場主催

第一回関数型言語勉強会 大阪