破滅のピラミッドvar g =...!step1 { a =>step2 { b =>step3 { c =>step4 { d =>// do something with a, b, c, d and g}}}}依存する非同期ステップが ピラミッドのように積み上がる外側のスコープの状態を暗黙に 参照していてモジュール性が低い
例 (Akka Streams):implicitval system = ActorSystem()implicit val mat = ActorMaterializer()!val a = Source(...)val b = Source(...)!val a1 = a.map(_ + 1)val b1 = b.map(_ - 1).map(_ * 2)!val c = (a1 zip b1).map{case (a, b) => a + b}!c.runWith(Sink.foreach(println))(mat)AB C+1—1×2+先ほどのデータフローを 関数型 DSL で記述する
39.
例 (Akka Streams):implicitval system = ActorSystem()implicit val mat = ActorMaterializer()!val a = Source(...)val b = Source(...)!val a1 = a.map(_ + 1)val b1 = b.map(_ - 1).map(_ * 2)!val c = (a1 zip b1).map{case (a, b) => a + b}!c.runWith(Sink.foreach(println))(mat)入力に適用する関数を 高階関数 map で繋ぎ合わせる関数入力AB C+1—1×2+
FRP の〈糊〉implicit valsystem = ActorSystem()implicit val mat = ActorMaterializer()!val a = Source(...)val b = Source(...)!val a1 = a.map(_ + 1)val b1 = b.map(_ - 1).map(_ * 2)!val c = (a1 zip b1).map{case (a, b) => a + b}!c.runWith(Sink.foreach(println))AB C+1—1×2+生成器非同期の文脈を局所化した高階関数 (map, zip 等)を使い、ビジネスロジックをパイプライン化する選択器局所化された非同期の文脈
47.
• 多くの FRPのデータフロー記述は宣言型 DSL:構築したデータフローを実際にスケジュールし実行するのはランタイムの役割what と how の分離implicit val system = ActorSystem()implicit val mat = ActorMaterializer()!val c = (a1 zip b1).map{case (a, b) => a + b}!c.runWith(Sink.foreach(println))(mat) ランタイム
例: 融合 (Fusing)•Akka Streams 2.0 の新機能This new abstraction … is called fusing. This feature… will be now possible to execute multiple streamprocessing steps inside one actor, reducing thenumber of thread-hops where they are notnecessary … will increase performance for varioususe cases, including HTTP.http://akka.io/news/2015/11/05/akka-streams-2.0-M1-released.html複数の処理ステップを 一つにまとめて性能向上