More Related Content Similar to 関数プログラミングことはじめ (20) More from Naoki Kitora (7) 関数プログラミングことはじめ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つは正しいコードではありません。
15. i = i + 1;
最初に見たとき違和感ありませんでしたか?
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. def f(n: Int): Int =
if (n == 0) 0
else f(n - 1) + n
f(0) = 0
f(n) = f(n - 1) + n
25. 階乗
f(0) = 1
f(1) = 1
f(2) = 2 * 1
f(3) = 3 * 2 * 1
...
f(n) = n * ... * 3 * 2 * 1
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. f(0) = 1
f(n) = n * f(n - 1)
def f(n: Int): Int =
if (n == 0) 1
else n * f(n - 1)
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. 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)
33. リストの定義
•空リスト Nil はリスト
•head が要素、tail がリストなら
head :: tail もリスト
3
Nil
Nil::
3 :: Nil2 ::
2 :: 3 :: Nil1 ::
自身を使って定義されたデータ型
•再帰的なデータ型
•自己参照をするデータ型
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. 一般化
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. 一般化
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. 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. 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)
}
44. お薦めのリソース
• Functional Programming Principles in Scala
Scala の作者である Martin Odersky 教授によ
る関数プログラミングの講義
https://www.coursera.org/course/progfun
• プログラミングの基礎
言語は OCaml だが関数プログラミングの入門
書としては良書
http://www.amazon.co.jp/dp/4781911609