SE情報技術研究会’s blog

http://se-info-tech.connpass.com

第1回 関数型プログラミング勉強会の簡単なまとめ

2015-07-18 『Scala関数型デザイン&プログラミング』読書会

第1章 関数型プログラミングとは

純粋関数=副作用がない関数

副作用とは

  • 変数を変更すること。
  • データ構造を直接変更すること。
  • オブジェクトのフィールドを変更すること。
  • 例外をスローすること。
  • エラーで停止すること。
  • コンソールに出力すること。
  • ユーザ入力を読み取ること。
  • ファイルの入出力があること。
  • 画面上に描画すること。

純粋関数はモジュール性があるためテスト、再利用、並列化、一般化、推論がしやすくなる。

メソッドの中で副作用が発生するとテストがしにくくなる。
→ テスタビリティに問題がある場合は設計を変更したほうがよい。

参照透過とは

  • 式と変数の値が同じ値であれば結果が同じでありかつ変数に変更がないこと。
  • 式の結果を返す以外の処理(副作用)がないこと。
  • プログラムの式とその結果を置き換えても意味が変わらないこと。

純粋関数の場合、式のみを評価し、その前後の状態などを考慮しないでよいため、コードの理解が楽になる。

逆に純粋関数でない場合、プログラムの一連の流れや実行される状態によって変わるため、コードの理解がむずかしくなる。

第2章 Scala関数型プログラミングの準備

高階関数=他の関数を引数として受け取ることが可能であり、関数を出力として返すことも可能な関数。

Scalaのobjectキーワードはシングルトンを意味する。

Scalaでは戻り値の型は型推論ができる場合は戻り値の指定をしないことも可能。
ただし、基本的には明示的に戻り値の型を宣言するのが推奨される。

val はイミュータブル(不変)な変数、varはミュータブルな変数。

副作用があるメソッドは純粋関数特別するため「プロシージャ」と呼ばれることもある。

Unit=Javaでいうvoid。

関数型プログラミングでは「関数は値」という考え方。

その他・雑談

RubyPythonから入った技術者だと引数のオブジェクトはコピー渡しなので、引数の値を変更させないという副作用の防止が、あたりまえすぎてピンとこない。

逆にJavaやCなどから入った技術者だと参照渡しなので、引数の値を変更させないという副作用の防止が、なるほどとピンとくる。

Javaだと自己再帰の仕方がよくわからない。
→ 宿題

今回は2.4 まで。次回は2.5から。