15. 関数型プログラミングってなんぞ?
● 入力に対し、関数をチェーンすることで
出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12
● 手続き型っぽい処理と比べると…
var sum = 0
for (i <- list) {
if (i % 2 == 0) {
sum += i * 2
}
}
15/53
16. 関数型プログラミングってなんぞ?
● 入力に対し、関数をチェーンすることで
出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12
抽出 変換 集計
● 手続き型っぽい処理と比べると…
var sum = 0
for (i <- list) {
if (i % 2 == 0) {
sum += i * 2
}
}
抽出 集計 変換
16/53
26. 関数型プログラミングってなんぞ?
● 遅延評価
● lazy val
scala> val v = {println("Hello val !"); 0}
Hello val !
v: Int = 0
scala> lazy val lVal = {println("Hello lazy val !"); 0}
lVal: Int = <lazy>
scala> println(lVal)
Hello lazy val !
0
scala> println(lVal)
0
26/53
29. 関数型プログラミングってなんぞ?
● パターンマッチ!
● 型別に振り分けてみる
scala> def judgeType(in: Any) = in match {
| case _: String => "String!"
| case _: Int => "Int!"
| case _ => "Other!"
| }
judgeType: (in: Any)java.lang.String
scala> judgeType("1")
res1: java.lang.String = String!
scala> judgeType(1)
res2: java.lang.String = Int!
scala> judgeType(1 :: Nil)
res3: java.lang.String = Other! 29/53
30. 関数型プログラミングってなんぞ?
● パターンマッチ!
● 定番のFizzBuzz
scala> def fizzbuzz(n: Int) = n match {
| case n if n % 15 == 0 => "fizzbuzz"
| case n if n % 3 == 0 => "fizz"
| case n if n % 5 == 0 => "buzz"
| case _ => n
| }
fizzbuzz: (n: Int)Any
scala> 1 to 20 map fizzbuzz
res1: scala.collection.immutable.IndexedSeq[Any] = Vector(1,
2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14,
fizzbuzz, 16, 17, fizz, 19, buzz)
30/53
31. 関数型プログラミングってなんぞ?
● パターンマッチ!
● CaseClassと組み合わせて
scala> case class Person(name: String, sex: String, age: Int)
defined class Person
scala> def judgePerson(p: Person) = p match {
| case Person(n, s, a) if s == "female" && a < 10 => n + ":幼女"
| case Person(n, s, a) if s == "female" => n + ":ババァ"
| case _ => "後はどうでもいい"
| }
judgePerson: (p: Person)java.lang.String
scala> judgePerson(Person("razonの娘", "female", 2))
res1: java.lang.String = razonの娘:幼女
31/53