命令プログラミングから関数プログラミングへ 関数プログラマは問題をどう考えるか  Scala 関西ビギナーズ 第 2 回
前提• 厳密な正確性よりもわかりやすさを重視
関数プログラミングの関数数学でいうところの関数f(x) = x + 1だから Scala では•関数定義に = (イコール) を使用•関数内で最後に評価された値が返る         def f(x: Int) {x + 1}Whichis  ...
関数プログラミング (狭義)• 変更可能な変数• 再代入• ループなどの命令型の制御 を使わずにプログラミングすること
命令プログラマの疑問 再代入やループなしにどうやって書くのか?int sum = 0;for (int i = 0; array.length = 0; i++) {  sum += array[i];}return sum;
i = i + 1;最初に見たとき違和感ありませんでしたか?
プログラミングの関心事命令プログラミング 具体的な手順を記述関数プログラミング 対象の性質を定義
関数プログラミングでの問題へのアプローチ問題を抽象化・一般化
問題ある自然数を引数にとり、0から当該自然数までの整数の合計を返す関数を定義せよ
命令プログラミング• 0からnまでカウントアップ• カウントアップした数字を足し込んでいくint f(int n) {    int total = 0;    for (int i = 0; i <= n; i++) {        tot...
例示して性質を抽出f(0) = 0f(1) = 0 + 1f(2) = 0 + 1 + 2f(3) = 0 + 1 + 2 + 3...f(n) = 0 + 1 + 2 + 3 + ... + n
具体から抽象へf(0) = 0f(1) = f(0) + 1f(2) = f(1) + 2f(3) = f(2) + 3...f(n) = f(n - 1) + n
f(0) = 0f(n) = f(n - 1) + ndef f(n: Int): Int =   if (n = 0) 0   else f(n - 1) + n
問題指定された自然数の階乗を返す関数を定義せよ
階乗f(0) = 1f(1) = 1f(2) = 2 * 1f(3) = 3 * 2 * 1...f(n) = n * ... * 3 * 2 * 1
階乗 (一般化)f(0) = 1f(1) = 1 * f(0)f(2) = 2 * f(1)f(3) = 3 * f(2)...f(n) = n * f(n - 1)
f(0) = 1f(n) = n * f(n - 1)def f(n: Int): Int =   if (n = 0) 1   else n * f(n - 1)
指定された数までのフィボナッチ数列を返す関数の定義は?
問題指定されたリスト内の数の合計を返す関数 sum を定義せよ
リストの定義• 空リスト Nil はリスト• head が要素、tail がリストならhead :: tail もリスト自身を使って定義されたデータ型•再帰的なデータ型•自己参照をするデータ型
例示1 :: 5 :: 1 :: 2 :: 8 :: Nil:: は右結合なので1 :: (5 :: (1 :: (2 :: (8 :: Nil))))1 :: (5 :: 1 :: 2 :: 8 :: Nil)     5 :: (1 :: ...
一般化sum(1 :: 5 :: 1 :: 2 :: 8 :: Nil)1 + sum(5 :: 1 :: 2 :: 8 :: Nil)     5 + sum(1 :: 2 :: 8 :: Nil)          1 + sum(2 ::...
sum(Nil) = 0head + sum(tail)def sum(list: List[Int]): Int =    if (list.isEmpty) 0    else list.head + sum(list.tail)def s...
型にあわせて処理を行う型が処理を導くという側面も
末尾再帰や木構造の処理、Option や例外処理のことなど他にもたくさん話したいことはあるのですが…。
お薦め書籍  Scala ではなく OCaml だが  関数プログラミングの基礎  が身につけられる  プログラミングの基礎  浅井健一  サイエンス社
木虎 直樹@kitora_naokiテキストマイニングプログラミング Scala, Java, JavaScript, Python, OCamlインフラ network, Web, AP, RDBMS, MTA, DNS, etc.
Upcoming SlideShare
Loading in …5
×

命令プログラミングから関数プログラミングへ

12,346 views

Published on

0 Comments
33 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
12,346
On SlideShare
0
From Embeds
0
Number of Embeds
339
Actions
Shares
0
Downloads
35
Comments
0
Likes
33
Embeds 0
No embeds

No notes for slide

命令プログラミングから関数プログラミングへ

  1. 1. 命令プログラミングから関数プログラミングへ 関数プログラマは問題をどう考えるか Scala 関西ビギナーズ 第 2 回
  2. 2. 前提• 厳密な正確性よりもわかりやすさを重視
  3. 3. 関数プログラミングの関数数学でいうところの関数f(x) = x + 1だから Scala では•関数定義に = (イコール) を使用•関数内で最後に評価された値が返る def f(x: Int) {x + 1}Whichis def f(x: Int) = return x + 1better? def f(x: Int) = x + 1 ※注: 上の 2つは正しいコードではありません。
  4. 4. 関数プログラミング (狭義)• 変更可能な変数• 再代入• ループなどの命令型の制御 を使わずにプログラミングすること
  5. 5. 命令プログラマの疑問 再代入やループなしにどうやって書くのか?int sum = 0;for (int i = 0; array.length = 0; i++) { sum += array[i];}return sum;
  6. 6. i = i + 1;最初に見たとき違和感ありませんでしたか?
  7. 7. プログラミングの関心事命令プログラミング 具体的な手順を記述関数プログラミング 対象の性質を定義
  8. 8. 関数プログラミングでの問題へのアプローチ問題を抽象化・一般化
  9. 9. 問題ある自然数を引数にとり、0から当該自然数までの整数の合計を返す関数を定義せよ
  10. 10. 命令プログラミング• 0からnまでカウントアップ• カウントアップした数字を足し込んでいくint f(int n) { int total = 0; for (int i = 0; i <= n; i++) { total += i; } return total;}
  11. 11. 例示して性質を抽出f(0) = 0f(1) = 0 + 1f(2) = 0 + 1 + 2f(3) = 0 + 1 + 2 + 3...f(n) = 0 + 1 + 2 + 3 + ... + n
  12. 12. 具体から抽象へf(0) = 0f(1) = f(0) + 1f(2) = f(1) + 2f(3) = f(2) + 3...f(n) = f(n - 1) + n
  13. 13. f(0) = 0f(n) = f(n - 1) + ndef f(n: Int): Int = if (n = 0) 0 else f(n - 1) + n
  14. 14. 問題指定された自然数の階乗を返す関数を定義せよ
  15. 15. 階乗f(0) = 1f(1) = 1f(2) = 2 * 1f(3) = 3 * 2 * 1...f(n) = n * ... * 3 * 2 * 1
  16. 16. 階乗 (一般化)f(0) = 1f(1) = 1 * f(0)f(2) = 2 * f(1)f(3) = 3 * f(2)...f(n) = n * f(n - 1)
  17. 17. f(0) = 1f(n) = n * f(n - 1)def f(n: Int): Int = if (n = 0) 1 else n * f(n - 1)
  18. 18. 指定された数までのフィボナッチ数列を返す関数の定義は?
  19. 19. 問題指定されたリスト内の数の合計を返す関数 sum を定義せよ
  20. 20. リストの定義• 空リスト Nil はリスト• head が要素、tail がリストならhead :: tail もリスト自身を使って定義されたデータ型•再帰的なデータ型•自己参照をするデータ型
  21. 21. 例示1 :: 5 :: 1 :: 2 :: 8 :: Nil:: は右結合なので1 :: (5 :: (1 :: (2 :: (8 :: Nil))))1 :: (5 :: 1 :: 2 :: 8 :: Nil) 5 :: (1 :: 2 :: 8 :: Nil) 1 :: (2 :: 8 :: Nil) 2 :: (8 :: Nil) 8 :: Nil
  22. 22. 一般化sum(1 :: 5 :: 1 :: 2 :: 8 :: Nil)1 + sum(5 :: 1 :: 2 :: 8 :: Nil) 5 + sum(1 :: 2 :: 8 :: Nil) 1 + sum(2 :: 8 :: Nil) 2 + sum(8 :: Nil) 8 + sum(Nil)sum(Nil) = 0head + sum(tail)
  23. 23. sum(Nil) = 0head + 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)}
  24. 24. 型にあわせて処理を行う型が処理を導くという側面も
  25. 25. 末尾再帰や木構造の処理、Option や例外処理のことなど他にもたくさん話したいことはあるのですが…。
  26. 26. お薦め書籍 Scala ではなく OCaml だが 関数プログラミングの基礎 が身につけられる プログラミングの基礎 浅井健一 サイエンス社
  27. 27. 木虎 直樹@kitora_naokiテキストマイニングプログラミング Scala, Java, JavaScript, Python, OCamlインフラ network, Web, AP, RDBMS, MTA, DNS, etc.

×