- Abe Asami “きの子 ”
- フリーランスプログラマ
- http://nocono.net/
- @aa7th
- Scala、Andorid(Java/Kotlin)
- FP in Scala 1章あたりの内容です
- 下記の用語のざっくりした説明
- 副作用
- イミュータブル・ミュータブル
- 参照透過性
- 純粋関数
- 「副作用」がないプログラムを目指す
- コンピュータの論理的な状態が変化すること
- 単に結果を返すこと以外に何かをする
- 変数の変更
- データ構造を直接変更
- オブジェクトのフィールドを設定
- 例外スロー、エラー停止
- コンソール出力やユーザー入力を読み取る
- ファイル入出力
- 画面への描画
- コードがテストしにくい
- 変数に想定外の値がはいっていた!というような事態がありうる
- 思わぬ場所で変数が再代入されていて「うああ!」っていう経験はありませんか?
- マルチスレッドで別スレッドがフィールドを書き換えるとか・・・
- コンピュータの論理的な状態を変化させない
- 先程の副作用がある処理を行わない
- 変数への代入を避けて定数を使用する
- 同一の入力値に対して、必ず同一の結果が返ってくる
- イミュータブル
- 副作用がない
- 不変
- ミュータブル
- 副作用がある
- 可変
- Stringはイミュータブル
- StringBuilderはミュータブル
- 式eがあり、すべてのプログラムpにおいて、pの意味に影響を与えることなく、p内のすべてのeをeの評価結果と置き換えることができるとしたら、eは参照透過です。(FP in Scalaより抜粋)
- 例えば
- 2 + 3 = 5
- 「2 + 3」と「5」は置き換えることができる
- 「2 + 3」と「5」は参照透過である
- String
- x と "Hello, World" を置き換えることができた
- x と "Hello, World" は参照透過である
- StringBuilder
- y と x.append(", World") を置き換えることができなかった
- y と x.append(", World")は参照透過ではない
- 2 + 3 = 5
- 関数fがあり、式f(x)が参照透過なすべてのxに対して参照透過であるとしたら、fは純粋関数です。(FP in Scalaより抜粋)
- 2 + 3 = 5
- 「+」というのは、2に3を足す関数
- 「+」は純粋関数である
- String
- reverseはxと"Helllo, World"を置き換えることができた
- reverseは純粋関数である
- StringBuilder
- StringBuilder.appendは純粋関数ではない