revival
Scala Summit 2017
https://goo.gl/iKyEKs
•
Scala 

Scala ?
?
•Scala
•
•
Scala ?
•
•
•
•
•
•
•
•
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
( )
• (mutable)
•
•
?
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
https://goo.gl/iKyEKs
• 1 n
•
int f(int n) {
int total = 0;
for (int i = 1; i <= n; i++) {
total += i;
}
return total;
}
f(1) = 1
f(2) = 1 + 2
f(3) = 1 + 2 + 3
...
f(n) = 1 + 2 + 3 + ... + n
f(1) = 1
f(2) = f(1) + 2
f(3) = f(2) + 3
...
f(n) = f(n - 1) + n
f(1) = 1
f(n) = f(n - 1) + n
def f(n: Int): Int =
if (n == 1) 1
else f(n - 1) + n
f(1) = 1
f(n) = f(n - 1) + n
f(0) = 1
f(1) = 1
f(2) = 2 * 1
f(3) = 3 * 2 * 1
...
f(n) = n * ... * 3 * 2 * 1
f(0) = 1
f(1) = 1 * f(0)
f(2) = 2 * f(1)
f(3) = 3 * f(2)
...
f(n) = n * f(n - 1)
f(0) = 1
f(n) = n * f(n - 1)
def f(n: Int): Int =
if (n == 0) 1
else n * f(n - 1)
n
?
1, 1, 2, 3, 5, 8, 13, …
f(0) = 0
f(1) = 1
f(2) = 0 + 1
f(3) = 1 + 1
f(4) = 1 + 2
f(5) = 2 + 3
...
f(0) = 0
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)
f(0) = 0
f(1) = 1
f(n) = f(n - 2) + f(n - 1)
def f(n: Int): Int =
if (n == 0) 0
else if (n == 1) 1
else f(n - 2) + f(n - 1)
sum
def sum(ints: List[Int]): Int
• Nil
•head tail
head :: tail
3
Nil
Nil::
3 :: Nil2 ::
2 :: 3 :: Nil1 ::
•
•


Nil
Nil::8
8 :: Nil::2
2 :: 8 :: Nil::1
1 :: 2 :: 8 :: Nil::5
5 :: 1 :: 2 :: 8 :: Nil
sum(5 :: 1 :: 2 :: 8 :: Nil)
sum( )

= + sum( )
sum( ) = + sum( )
sum( ) = + sum( )
sum( ) = + sum( )
sum( ) = 0Nil
8 :: Nil
2 :: 8 :: Nil
5 :: 1 :: 2 :: 8 :: Nil
Nil8
8 :: Nil2
2 :: 8 :: Nil1
5 1 :: 2 :: 8 :: Nil
1 :: 2 :: 8 :: Nil
sum( ) = + sum( )
sum( ) = + sum( )
sum( ) = + sum( )
sum( ) = 0Nil
8 :: Nil
2 :: 8 :: Nil
Nil8
8 :: Nil22 :: 8 :: Nil
1
head
head tail
head tail
head tail head :: tail
1 :: 2 :: 8 :: Nil
tail
sum(Nil) = 0
sum(head :: tail) = 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)
}
product
def product(ints: List[Int]): Int
max
def max(ints: List[Int]): Int
reverse
def reverse(ints: List[Int]): List[Int]
length
def length(ints: List[Int]): Int
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)
}
• Functional Programming Principles in Scala

Scala Martin Odersky


https://www.coursera.org/course/progfun
• 

OCaml


http://www.amazon.co.jp/dp/4781911609
• Scala & ―
Scalaz


2 

http://www.amazon.co.jp/dp/4844337769
関数プログラミングことはじめ revival

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