9. Scalaz
• https://github.com/scalaz/scalaz
• キャッチフレーズ
• 昔: Scalaz: Type Classes and Pure Functional Data
Structures for Scala
• 今: An extension to the core Scala library for functional
programming. http://typelevel.org
• 最新の関数型プログラミングを可能にする機能群を
Scala向けに⽤用意
• 型クラス
• 純粋関数型データ構造
15. 代数的構造デザインパターン
• 半群 (semigroup)
• モノイド (monoid)
• 群 (group)
結合律律 (associative law)
• 可換半群
• 可換モノイド
• 可換群(アーベル群)
可換律律 (commutative law)
• 環 (ring)
• 体 (field)
分配律律 (distributive law)
(a + b) + c = a + (b + c)
a + b = b + a
a * (b + c) = a * b + a * c
20. A → B
• 関数の基本
• 型Aの値を型Bの値に置き換える (置き換えモデル,
substitution model)
• 副作⽤用はないので、A→Bの関数の外側にいかなる影響も
与えない (no side effect)
• 型Aの値が同じなら、いかなるタイミングで呼び出して
も型Bの同じ値が返る (参照透過性, referential
transparency)
• 圏論論:射(arrow, morphism)
• 論論理理学:ならば(imply)
• def f(x: A): B
21. A → B → C
• 引数が2つある関数
• 「A → B」の形の関数(引数が1つ)の合成で記述
• A → (B → C)
• Aを引数に取り「B→Cの関数」を返す関数
• def f(a: A, b: B): C
• def f(a: A)(b: B): C
• def f(a: A): B => C
• val f: A => B => C
22. A → A → A
• 「A → B → C」の特殊な形
• A, B, Cが同じ型
• ⼆二項演算⼦子
• f(x: A, y: A): A
• 1 + 1 → 2
• “abc” + “xyz” → “abcxyz”
• List(“abc”) ++ List(“xyz”) → List(“abc”, “xyz”)
33. 代数的データ型
• Algebraic data type
• 直積の直和の総和
• 再帰構造
case class Person(name: String, age: Int)
Case class Company(name: String, phone: String)
ケースクラスで直積を実現
Either[Person, Company]
Eitherで直積の直和を実現
sealedトレイトで直積の直和の総和を実現
sealed trait Party
case class Person(name: String, age: Int) extends Party
case class Company(name: String, phone: String) extends Party
42. scalaz stream
• com.everforth.lib.util.FileBag
for {
bag <- resource.managed(new FileBag())
bag2 <- resource.managed(new FileBag())
bag3 <- resource.managed(new FileBag())
} {
Process.constant(4096).through(io.chunkR(new URL("http://scala-
lang.org/").openStream)).to(bag.chunkW).run.run
bag.chunksR(4096).to(bag2.chunkW).run.run
bag2.linesR.map(_ +
"n").pipe(text.utf8Encode).to(bag3.chunkW).run.run
bag.size should be (bag2.size)
bag.size should be (bag3.size)
}
43. Spark
• RDD (Resilient Distributed Dataset)
• http://www.cs.berkeley.edu/~pwendell/strataconf/api/core/
spark/RDD.html
scala> val textFile = sc.textFile("README.md")
textFile: spark.RDD[String] = spark.MappedRDD@2ee9b6e3
scala> val linesWithSpark = textFile.filter(line =>
line.contains("Spark"))
linesWithSpark: spark.RDD[String] = spark.FilteredRDD@7dd4af09
scala> textFile.filter(line => line.contains("Spark")).count() // How
many lines contain "Spark"?
res3: Long = 15
44. RxJava - Scala
• Functional Reactive Programming
• https://github.com/Netflix/RxJava
• http://techblog.netflix.com/2013/02/rxjava-netflix-api.html
def simpleComposition() {
// fetch an asynchronous Observable<String>
// that emits 75 Strings of 'anotherValue_#'
customObservableNonBlocking()
// skip the first 10
.skip(10)
// take the next 5
.take(5)
// transform each String with the provided function
.map({ stringValue -> return stringValue + "_transformed"})
// subscribe to the sequence and print each transformed String
.subscribe({ println "onNext => " + it})
}