5. What does Functional
Programming Mean?
• 「関数型プログラミング」→いろんな言語
で定義はまちまち(少しあいまいな概念)
• Clojure 的には...
- immutableなデータ構造
- 高階関数(higher-order-functions)
- 関数合成、等々
5
6. On the Importance of
Values(1)
• About Values
- JVM標準のBoolean、Number、
Character、String、といった型は、
Clojureでは immutable な値として利用
できるようにしている(安心して使っ
てよし!)
6
7. On the Importance of
Values(2)
• Clojure では以下の比較式はすべてtrue
(= 5 5)
(= 5 (+ 2 3))
(= "boot" (str "bo" "ot")) ; 下記Memo 参照
(= nil nil)
(let [a 5]
(do-something-with-a-number a)
(= a 5))
Memo: Clojure における ‘=’ は、imutable な’値’に対して比較。javaの == とはちょっと違う。
clojure.core/=
([x] [x y] [x y & more])
Equality. Returns true if x equals y, false if not. Same as
Java x.equals(y) except it also works for nil, and compares
numbers and collections in a type-independent manner. Clojure's immutable data
structures define equals() (and thus =) as a value, not an identity,
comparison.
7
8. On the Importance of
Values(3)
• Comparing Values to Mutable Objects
Mutable Object の例(StatefulInteger class)
public class StatefulInteger extends Number {
private int state;
public StatefulInteger (int initialState) {
this.state = initialState; }
public void setInt (int newState) { this.state = newState; }
public int intValue () { return state; }
public int hashCode () { return state; }
public boolean equals (Object obj) {
return obj instanceof StatefulInteger &&
state == ((StatefulInteger)obj).state;
}}
8
30. Pure Functions
• Why Are Pure Functions Interesting?
• Pure functions are easier to reason about.
• 入力パラメータが決まれば出力は必ず同じ出力になる。
• Pure functions are easier to test.
• (関数を実行する時点の)状態を考える必要がないのでテストしやすい。
• Pure functions are cacheable and trivial to parallelize.
• 入力パラメータが決まれば出力は必ず同じー>入力パラメータに対応し
た出力結果をキャッシュ(メモ化)することで、2回目以降の呼び出しを
高速化できる。
(次ページにメモ化の例)
30