Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

1

Share

Download to read offline

関数プログラミングことはじめ

Download to read offline

Scala Kansai Summit 2015 でハンズオンセッションで使用したスライド

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

関数プログラミングことはじめ

  1. 1. 関数プログラミング ことはじめ Scala 関西 Summit 2015
  2. 2. はじめに確認 JDK 入ってますか?
  3. 3. 前提 • 厳密な正確性よりもわかりやすさを重視
  4. 4. Scala 難しい
 という意見を聞くことがあります。
  5. 5. Scala は本当に難しい?
  6. 6. 複数の要因を一緒にして いない?
  7. 7. •Scala の言語仕様が難しい •関数プログラミングが難しい •型システムが難しい Scala の難しさって?
  8. 8. •関数プログラミングが難しい • 命令プログラミングのパラダイムとい う先入観をもって、関数プログラミン グのパラダイムを学ぶ難しさ • 関数型言語が基礎とする数学概念の難 しさ • プログラミングの難しさ 本日のテーマ
  9. 9. •関数プログラミングが難しい • 命令プログラミングのパラダイムとい う先入観をもって、関数プログラミン グのパラダイムを学ぶ難しさ • 関数型言語が基礎とする数学概念の難 しさ • プログラミングの難しさ 本日のテーマ
  10. 10. 関数プログラミングのパラダ イムを理解するきっかけを掴 む 本日のゴール
  11. 11. 関数プログラミングの関数 数学でいうところの関数 f(x) = x + 1 だから Scala では •関数定義に = (イコール) を使用 •関数内で最後に評価された値が返る Which is better? def f(x: Int) {x + 1} def f(x: Int) = x + 1 def f(x: Int) = return x + 1 ※注: 上の 2つは正しいコードではありません。
  12. 12. 関数プログラミング (狭義) • 変更可能な変数 • 再代入 • ループなどの命令型の制御 を使わずにプログラミングすること
  13. 13. お願い 現時点での関数プログラミングに対する疑問を 紙に書き出してください。 2分
  14. 14. 命令プログラマの疑問 再代入やループなしにどうやって書くのか? int sum = 0; for (int i = 0; i < array.length; i++) { sum += array[i]; } return sum;
  15. 15. i = i + 1; 最初に見たとき違和感ありませんでしたか?
  16. 16. 命令プログラミング 具体的な手順を記述 関数プログラミング 対象の性質を定義 プログラミングの関心事
  17. 17. 関数プログラミングでの問題へのアプローチ 問題を抽象化・一般化
  18. 18. 環境セットアップ JDK IntelliJ IDEA Scala プラグイン https://goo.gl/iKyEKs
  19. 19. 問題 ある自然数を引数にとり、0から当 該自然数までの整数の合計を返す関 数を定義せよ
  20. 20. 命令プログラミング • 0からnまでカウントアップ • カウントアップした数字を足し込んでいく int f(int n) { int total = 0; for (int i = 0; i <= n; i++) { total += i; } return total; }
  21. 21. 例示して性質を抽出 f(0) = 0 f(1) = 0 + 1 f(2) = 0 + 1 + 2 f(3) = 0 + 1 + 2 + 3 ... f(n) = 0 + 1 + 2 + 3 + ... + n
  22. 22. 具体から抽象へ f(0) = 0 f(1) = f(0) + 1 f(2) = f(1) + 2 f(3) = f(2) + 3 ... f(n) = f(n - 1) + n f(0) = 0 f(n) = f(n - 1) + n
  23. 23. def f(n: Int): Int = if (n == 0) 0 else f(n - 1) + n f(0) = 0 f(n) = f(n - 1) + n
  24. 24. 問題 指定された自然数の階乗を返す関数 を定義せよ
  25. 25. 階乗 f(0) = 1 f(1) = 1 f(2) = 2 * 1 f(3) = 3 * 2 * 1 ... f(n) = n * ... * 3 * 2 * 1
  26. 26. 階乗 (一般化) f(0) = 1 f(1) = 1 * f(0) f(2) = 2 * f(1) f(3) = 3 * f(2) ... f(n) = n * f(n - 1)
  27. 27. f(0) = 1 f(n) = n * f(n - 1) def f(n: Int): Int = if (n == 0) 1 else n * f(n - 1)
  28. 28. フィボナッチ数列の n 項目の値を返 す関数の定義は? 1, 1, 2, 3, 5, 8, 13, …
  29. 29. フィボナッチ数 f(0) = 1 f(1) = 1 f(2) = 1 + 1 f(3) = 1 + 2 f(4) = 2 + 3 f(5) = 3 + 5 ...
  30. 30. フィボナッチ数 f(0) = 1 f(1) = 1 f(2) = f(0) + f(1) f(3) = f(1) + f(2) f(4) = f(2) + f(3) f(5) = f(3) + f(4) ... f(n) = f(n - 2) + f(n - 1)
  31. 31. f(0) = 1 f(1) = 1 f(n) = f(n - 2) + f(n - 1) def f(n: Int): Int = if (n == 0) 1 else if (n == 1) 1 else f(n - 2) + f(n - 1)
  32. 32. 問題 指定されたリスト内の数の合計を返す 関数 sum を定義せよ def sum(ints: List[Int]): Int
  33. 33. リストの定義 •空リスト Nil はリスト •head が要素、tail がリストなら head :: tail もリスト 3 Nil Nil:: 3 :: Nil2 :: 2 :: 3 :: Nil1 :: 自身を使って定義されたデータ型 •再帰的なデータ型 •自己参照をするデータ型
  34. 34. 例示 sum(5 :: 1 :: 2 :: 8 :: Nil) = 5 + 1 + 2 + 8 + 0 sum(Nil) = 0 sum(8 :: Nil) = 8 + 0 sum(2 :: 8 :: Nil) = 2 + 8 + 0 sum(1 :: 2 :: 8 :: Nil) = 1 + 2 + 8 + 0 sum(5 :: 1 :: 2 :: 8 :: Nil) = 5 + 1 + 2 + 8 + 0
  35. 35. 一般化 sum(Nil) = 0 sum(8 :: Nil) = 8 + sum(Nil) sum(2 :: 8 :: Nil) = 2 + sum(8 :: Nil) sum(1 :: 2 :: 8 :: Nil) = 1 + sum(2 :: 8 :: Nil) sum(5 :: 1 :: 2 :: 8 :: Nil)
 = 5 + sum(1 :: 2 :: 8 :: Nil)
  36. 36. 一般化 sum(Nil) = 0 sum(8 :: Nil) = 8 + sum(Nil) sum(2 :: 8 :: Nil) = 2 + sum(8 :: Nil) sum(Nil) = 0 sum(head :: tail) = head + sum(tail) head tail head tail
  37. 37. sum(Nil) = 0 head + sum(tail) def sum(list: List[Int]): Int = if (list.isEmpty) 0 else list.head + sum(list.tail) def sum(list: List[Int]): Int = list match { case Nil => 0 case head :: tail => head + sum(tail) }
  38. 38. def sum(list: List[Int]): Int = list match { case Nil => 0 case head :: tail => head + sum(tail) } def sum(list: List[Int]): Int = { def loop(acc: Int, l: List[Int]): Int = l match { case Nil => acc case head :: tail => loop(acc + head, tail) } loop(0, list) }
  39. 39. 問題 指定されたリスト内の数を掛け合わせ た値を返す関数 product を定義せよ def product(ints: List[Int]): Int
  40. 40. 問題 指定されたリスト内の最大値を返す関 数 max を定義せよ def max(ints: List[Int]): Int
  41. 41. 問題 指定されたリストを逆順に並び替えて 返す関数 reverse を定義せよ def reverse(ints: List[Int]): List[Int]
  42. 42. 問題 指定されたリストの長さを返す関数 length を定義せよ def length(ints: List[Int]): Int
  43. 43. 型にあわせて処理を行う 型が処理を導くという側面も
  44. 44. お薦めのリソース • Functional Programming Principles in Scala
 Scala の作者である Martin Odersky 教授によ る関数プログラミングの講義
 https://www.coursera.org/course/progfun • プログラミングの基礎
 言語は OCaml だが関数プログラミングの入門 書としては良書
 http://www.amazon.co.jp/dp/4781911609
  45. 45. • Scala関数型デザイン&プログラミング ― Scalazコントリビューターによる関数型徹底 ガイド
 前の 2つよりも難易度は高い。
 http://www.amazon.co.jp/dp/4844337769
  • KojiMurakami

    Oct. 19, 2015

Scala Kansai Summit 2015 でハンズオンセッションで使用したスライド

Views

Total views

1,341

On Slideshare

0

From embeds

0

Number of embeds

290

Actions

Downloads

2

Shares

0

Comments

0

Likes

1

×