Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to functional programming

Shigeki Shoji
September 14, 2022

Introduction to functional programming

Shigeki Shoji

September 14, 2022
Tweet

More Decks by Shigeki Shoji

Other Decks in Technology

Transcript

  1. Referential Transparency (参照透過性) 参照透過性とは、「プログラムの構成要素が同じもの同士は等しい」ということです。 例えば: 1 と 1 は等しい 文字列

    abc と文字列 abc は等しい 関数 f(1) と 関数 f(1) は等しい つまり、変数 a と b に同じ値 (1 や abc や f(1)) を代入しているなら、a と b は等しいという ことになります。 4
  2. Immutable (不変性) 構造化/手続き型/ 命令型プログラミングでは、次の例のように、変数をミュータブルに使用す るのが一般的です。 int sum = 0; for

    (int x: list) sum = sum + x; 変数 sum、x の値はプログラムの実行中に値を変化させます。これは、参照透過性の破壊を 意味します。 関数型プログラミングでは、イミュータブルな変数を利用することが一般的です。 6
  3. Map、Filter、Reduce ここで説明する Map、Filter、Reduce はコレクションやストリームを扱う高階関数を使うパ ターンです。 map(f) は、要素の型を変換する関数が引数になります。元の型 E を変換後の型 F

    にしま す。 filter(f) は、要素の値を評価して通過させる場合は true、破棄する場合は false を返す関 数が引数になります。 reduce(f) は、コレクションやストリームの要素の合計値を求めるというような計算に使 用します。引数は要素の値を使って集計する関数になります。 val seq = Seq("1", "2", "3", "2", "2", "4") seq.map(_.toInt).filter(_ == 2).reduce((x, y) => x + y) 9
  4. method と function の違い C++ や Java ではオブジェクトにフィールド (field) やメソッド

    (method) を定義します。 method はオブジェクトの field を使用するロジックを記述します。 ロジックは、基本的には上のステートメントから下のステートメントに順番に実行され、ル ープによって上のステートメントに戻ったり、条件文によって、特定のコードブロックが実 行される、手法 (method) を記述します。 対して、関数 (function) は式 (formula) を定義します。 10
  5. Scala の Option の使い方 Option[T] は None か Some(T) のいずれかになります。

    val maybeId: Option[Integer] = Option(1) // or Some(1) maybeId.map { id => System.out.println(id); id; } 11
  6. Scala の Either の使い方 Either[L, R] は Left(L) か Right(R)

    のいずれかになります。 import java.io._ val line: Either[IOException, String] = Right("abc") line.map { l => System.out.println(l); l; } 12