WIP

木村さん勉強会

created at 2016.09.28
updated at 約1年 ago
vsanna / public 関数型言語

関数型プログラミング言語とは

# とあるsample code

num = 100
mokuto_list = Array.fill(num)(1)

要点をまとめると、

  1. 並列化で処理を高速化させたい
  2. 結果、同一変数を複数スレッドが参照してしまい、意図しない変数の操作が行われることが発生
  3. それを避けるべくある制約を用いる形にへんこうすると効果的

その制約が副作用を起こさないようにするというもの

副作用の例

  • 変数の上書き
  • 画面の書き換え
  • dbの書き込み

副作用を無くせる?

  • 完全には無理
    • db書き込み / 画面出力
  • 無くせるところをなくす

そのために効果的な考え方が関数型言語

どうやってなくす?

  • 関数単位に分ける
  • その中で
# 副作用あり
def twice
  nums = [1, 2, 3, 4]
  array = []
  nums.each { |num| array << num * 2}
  nums
end

# 副作用なし
def twice
  nums = [1, 2, 3, 4]
  nums.map { |num| num * 2 }
end

副作用がないメリット

  1. 並列化しやすい
  2. テストしやすい
  3. モジュール化しやすい
    • 置換モデル
      • 副作用がないと単純に置き換え可能

練習

練習1

  1. あるコードを副作用ない用に修正
  2. sum
  3. 各要素5倍
  4. 偶数だけ抽出

練習2

  1. hoge
  2. hoge
  3. geho

オマケ

  • 高階関数が利用できると処理の修正が楽
    • arr.map(&:to_s)みたいなもの
  • 書き方辛くない?
    • パターンマッチがあると楽ちん
list match {
  case x :: xs => x + "b"
  case Nil => "a"
}

shareシェアする

forumコメント

まだコメントはありません!
ログインしてコメントを残す
{{comment.user.name}} on {{commentCreatedAt()}}

content_copy前後のイシュー

{{message}}