reactive programming with scala and akka 読書会第1回
TRANSCRIPT
Reactive Programmingwith Scala and Akka読書会 第1回
2016-05-27 はせがわ
http://goo.gl/KOBfQM
Chapter2Functional Reactive Programming in Scala
• 不変性(immutability)• 遅延評価(lazy evaluation)• 関数合成(Function Composition)• Functor, Applicative Functor and Monad
この章で学ぶこと
Mutability(可変性) vs Immutability(不変性)
Functional Reactive なプログラミングを行うには
Immutable(不変)の方が良い
Immutable(不変)が良い理由
• 参照透過性(Referential Transparency)が保ちやすい
• 状態(State)が複数スレッドで共有されても問題ない
• ロックが不要
Collections(Immutable)• Immutable(不変)なものとMutable(可変)なものがある※ ここではImmutableなものを見ていく
• 要素の追加や削除は新たなインスタンスをつくる
• メソッド:map, flatMap, filter, sort, fold...
Lazy Evaluation(遅延評価)
• 「lazy val 変数名 = 値や式」
• 「lazy」をつけると変数は宣言時には評価されていない
• 処理中に初めてアクセスされた際に評価される
• 評価された変数は再評価されない
Function Composition(関数合成)• 関数オブジェクトの(B => C)と(A =>B)がある場合、関数合成で(A => C)ができる
• 関数オブジェクト 例:(B => C)• B型のオブジェクトの引数をとってC型のオブジェクトを返す関数オブジェクト
カリー化(Curry)• 関数func(A, B):Cがある場合、カリー化することでfunc(A):(B => C)にすることができる
• Scalaだと関数にcurriedキーワードを使うことでカリー化できる
scala> def add(a: Int, b:Int): Int = { a + b }add: (a: Int, b: Int)Int
scala> val curriedAdd = (add _).curriedcurriedAdd: Int => (Int => Int) = <function1>
Functor, Applicative Functor, and Monads• 関数型プログラミングの重要なコンセプト
• Scalaz=純粋関数型PGを行うためのライブラリ
• ざっくりと Functor ◁- Applicative ◁-Monad と継承している
型クラス(Typeclass)• ふるまいを定義するインタフェース
• ふるまいとデータを定義するデザパタ• mapだと中身を変えるふるまい(関数)に対しListやOptionなどのデータに適用できる
• Functor、Applicative、Monadは型クラス
Functor• map関数• map[A, B](fa: F[A])(f: A=>B): F[B]
• 関数を受け取りFunctor(※ここだとF)が持つ値を変換する
• 例えばFをListやOptionだとしてAがIntでBがString(Bは同じ型(Int)でも可)
Applicative Functor part.1
• Functorを拡張したもの
• pure関数• pure[A](a: => A): F[A] = point(a)
• point[A](a: => A): F[A]• point関数はpure関数の別名
• pureはfinalでpointはoverride可能にすることで色んな型に対応できる
@grimroseさんの助言
Applicative Functor part.2
• ap関数• ap[A, B](fa: =>F[A])(f: =>F[A=>B]):F[B]• Apply[F]の関数
• <*>関数• <*>[B](f: F[A=>B]):F[B]
Monad• Applicative Functorを拡張したもの
• bind関数• bind[A, B](fa: F[A])(f: A=>F[B]):F[B]• 実質的にはflatMap