Skip to content

Instantly share code, notes, and snippets.

@SAMMY7th
Created June 17, 2017 13:26
Show Gist options
  • Save SAMMY7th/549d05735cdc76fad29b307698a75312 to your computer and use it in GitHub Desktop.
Save SAMMY7th/549d05735cdc76fad29b307698a75312 to your computer and use it in GitHub Desktop.
【東京】【女性/女性同伴男性限定】Java x Scala 交流会 - Java女子部 (https://javajo.doorkeeper.jp/events/59755) での登壇資料です。

副作用と参照透過性

自己紹介

  • Abe Asami “きの子 ”
  • フリーランスプログラマ
  • http://nocono.net/
  • @aa7th
  • Scala、Andorid(Java/Kotlin)

今日の内容

  • FP in Scala 1章あたりの内容です
  • 下記の用語のざっくりした説明
    • 副作用
    • イミュータブル・ミュータブル
    • 参照透過性
    • 純粋関数

関数型プログラミングの特徴

  • 「副作用」がないプログラムを目指す

副作用とは

  • コンピュータの論理的な状態が変化すること
  • 単に結果を返すこと以外に何かをする

下記は副作用がある (Fp in Scala 1章より)

  • 変数の変更
  • データ構造を直接変更
  • オブジェクトのフィールドを設定
  • 例外スロー、エラー停止
  • コンソール出力やユーザー入力を読み取る
  • ファイル入出力
  • 画面への描画

副作用があると何が困るのか

  • コードがテストしにくい
  • 変数に想定外の値がはいっていた!というような事態がありうる
    • 思わぬ場所で変数が再代入されていて「うああ!」っていう経験はありませんか?
    • マルチスレッドで別スレッドがフィールドを書き換えるとか・・・

副作用がないとはどういうこと?

  • コンピュータの論理的な状態を変化させない
    • 先程の副作用がある処理を行わない
    • 変数への代入を避けて定数を使用する
  • 同一の入力値に対して、必ず同一の結果が返ってくる

イミュータブル・ミュータブル

  • イミュータブル
    • 副作用がない
    • 不変
  • ミュータブル
    • 副作用がある
    • 可変

例)StringとStringBuilder

  • 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")は参照透過ではない

純粋関数

  • 関数fがあり、式f(x)が参照透過なすべてのxに対して参照透過であるとしたら、fは純粋関数です。(FP in Scalaより抜粋)
  • 2 + 3 = 5
    • 「+」というのは、2に3を足す関数
    • 「+」は純粋関数である
  • String
    • reverseはxと"Helllo, World"を置き換えることができた
    • reverseは純粋関数である
  • StringBuilder
    • StringBuilder.appendは純粋関数ではない
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment