SlideShare a Scribd company logo
高速・軽量Webフレームワーク 
関西関数型道場 
2014-09-06 
で学ぶ
• Suguru Hamazaki (@hamazy) 
• とあるマーケティング会社で勤務 
• 先週まで WordPress ホスティングの 
会社にいました
• an open-source toolkit for building REST/HTTP-based 
integration layers 
REST/HTTPによる統合レイヤーを構築するための、オープンソースなツールキット 
• on top of Scala and Akka 
• asynchronous, actor-based, fast, lightweight, 
modular and testable 
— from http://spray.io/ 
Scala と Akka がベース 
非同期、Actorベース、高速、軽量、モジュラー化されており、テスト可能
Akka is a toolkit and runtime for 
building highly concurrent, distributed, 
and fault tolerant event-driven 
applications on the JVM. 
Akka は並列度が高く、分散した、耐障害性の高い、イベント駆動型の 
アプリケーションを作成するツールキットであり、実行環境です。 
— from http://akka.io/
Actor 
• 並行計算のモデル 
• スレッドモデルよりも抽象度が高く、扱い易い 
• イベント駆動型の受信ループでメッセージを非同期に処理 
• Non-blocking で高速 
• Akkaのactorは非常に軽量 
• 1GBのメモリーにつき数百万のactorが動作
Sprayのアプリで、 
Actorがどのように使われるか見てみましょう 
(demo)
• ActorSystem から Actor を作った 
• Spray が提供する Actor とメッセージをやりとり 
して、簡単な HTTP のサービスが出来た 
• Http.Bind, Http.Bound, Http.Connected, 
Http.Register, HttpRequest, HttpResponse
• HTTPのイベントに対応したロジックはそれはそ 
れでわかりやすい 
• が、全部それで書くのはしんどい 
• HTTPとアプリ、レイヤーは分けたい
Spray Routing
• ルーティングを定義 
• どんなリクエストをどこで処理するか 
• HTTPからアプリのレイヤーへの橋渡し 
• 抽象化された柔軟な内部DSLで書ける 
• 内部DSLなのでScalaの型チェックが入る
簡単なルーティングの定義を 
見てみましょう 
(demo)
• リクエストのメソッド名、パス、パラメーター 
で、処理するリクエストを抽出できた 
• パス、パラメーターの構造に応じて、処理の型 
が決まった 
• 型が合わないとコンパイルエラー
型安全は嬉しい
柔軟性も欲しい
complete の例 
complete(StatusCodes.OK) 
StatusCode 型 
complete("Hello.") String 型 
complete(HttpResponse(entity = "Hello")) 
⋮ HttpResponse 型
もっと色々渡したい 
• JSON オブジェクト 
• XML (NodeSeq型) 
• Future型 
• 任意の型のドメインオブジェクト
渡す値の型が共通のインターフェイスを 
継承することは、とても期待できない
さてどうしましょう
メソッドオーバー 
ローディング? 
いいえ、implicit です
• 似たコードの繰り返しを防ぐ 
• 型消去にまつわる問題を回避 
• Future[String] と Future[NodeSeq] を区別して 
もらわないと困る
実際の complete の定義 
def complete: 
(⇒ ToResponseMarshallable) ⇒ StandardRoute
ほぼこれに一致 
def complete( 
marshallable: ⇒ ToResponseMarshallable): 
StandardRoute 
(このメソッドを関数へ持ち上げると、先ほどのコードになる)
def complete( 
marshallable: ⇒ ToResponseMarshallable): 
StandardRoute 
この関数で、 
どうやって多様な型に 
対応しているのか?
Implicits
Implicits 
• 暗黙の型変換 / 暗黙のパラメーター 
• Haskell でいう型クラスを Scala で実現するため 
のもの
Haskell の型クラス 
class Ord a where 
(<=) :: a -> a -> Bool 
順序という概念を 
定義 
instance (Ord a, Ord b) => Ord (a, b) where 
(xa, xb) <= (ya, yb) = xa < xb || (xa == ya && xb <= yb) 
概念をペアについて 
実装したモデル
sort :: Ord a => [a] -> [a] 
> sort [ (3, 5), (2, 4), (3, 4) ] 
概念を前提とする 
関数を定義 
関数をこのように使用できるのは、 
ペアについて実装したモデルがあるため
Scala の暗黙パラメーターで 
trait Ord[T] { 
def compare (a:T, b:T):Boolean 
} 
順序という概念を 
implicit object intOrd extends Ord[Int] { 
def compare (a:Int, b:Int):Boolean = a <= b 
} 
定義 
概念を Int について 
実装したモデル
def sort[T](xs:List[T])(implicit ordT:Ord[T]):List[T] 
> sort (List (3, 2, 1)) 
List (1, 2, 3) 
概念を前提とする 
関数を定義 
関数をこのように使用できるのは、 
ペアについて実装したモデルがあるため
更に、暗黙型変換で 
trait Ordered[T] { 
def compare (o: T) : Boolean 
} 
implicit def mkOrd[T](x:T)(implicit ev: Ord[T]): Ordered[T] = 
new Ordered[T] { 
def compare(o: T) = ev.compare(x, o) 
} 
> 1.compare(2) 
true 
OOP的に書けるようになった!
implicit のルール 
• プレフィックスなしでアクセスできる、implicit 
な値 (もしくは変換) を探しにいく 
• 目的の型 (変換の場合は変換元と変換先) のコン 
パニオンオブジェクトのメンバーから、implicit 
な値 (もしくは変換) を探しにいく 
詳しくは、 http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html 参照
complete を 
もう一度見てみる
メソッド呼び出し 
complete("Hello.") メソッド定義 
trait RouteDirectives { 
… 
def complete: 
(⇒ ToResponseMarshallable): StandardRoute 
… 
} 
ToResponseMarshallable 
という概念を String で実現したモデルが、どこ 
かにあるはず
object ToResponseMarshallable { 
implicit def isMarshallable[T](value: T)(implicit marshaller: 
ToResponseMarshaller[T]): ToResponseMarshallable 
… 
} 
ToResponseMarshaller という概念を 
String で実現したモデルが、どこかにあるはず
object ToResponseMarshaller extends BasicToResponseMarshallers 
with MetaToResponseMarshallers 
with LowPriorityToResponseMarshallerImplicits { 
def fromMarshaller[T] 
(status: StatusCode = StatusCodes.OK, 
headers: Seq[HttpHeader] = Nil) 
(implicit m: Marshaller[T]): ToResponseMarshaller[T] 
… 
} 
Marshaller という概念を String で実現した 
モデルが、どこかにあるはず
object Marshaller extends BasicMarshallers 
with MetaMarshallers 
with MultipartMarshallers { 
… 
} 
trait BasicMarshallers { 
… 
implicit val StringMarshaller: Marshaller[String] 
… 
} 
Marshaller という概念を String で実現した 
モデルが、ここにあった!
• 結局、Marshaller[String]があれば充分だった 
• 他にも様々な Marshaller が Spray に用意されて 
いる 
• 独自の型で complete を利用する場合は、有効な 
スコープやその型のコンパニオンオブジェクトに 
implicit な Marshaller[T] を定義すればよい
まとめ 
• AkkaベースのSprayはActorを使って非同期、ノン 
ブロッキングで動いている 
• Spray のルーティング定義は型安全かつ柔軟な 
DSL で書ける 
• それには Scala の implicit の仕組みを利用している 
• Scala の implicit は Haskell の型クラスに相当する
Scala も Haskell もその他の言語も 
一緒に勉強しましょう
今日はお話しできなかった事 
• 型安全で柔軟な Spray Routing の DSL には、他 
に Shapeless が一役買っている 
• C++ の Template Meta-Programming のような、 
コンパイル時における型レベルのプログラミング
See you 
soon!
参考情報 
• The Magnet Pattern (from spray blog) 
• Type Classes as Objects and Implicits (PDF) 
• Spray on Akka (Typesafe webinar on 
2013-11-19)
QA
Image Credits

More Related Content

What's hot

プログラミングHaskell(第2章)
プログラミングHaskell(第2章)プログラミングHaskell(第2章)
プログラミングHaskell(第2章)yaju88
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
Hiromi Ishii
 
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
yo0824
 
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
nagise
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
Yuta Yokoi
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
Yasuaki Takebe
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 

What's hot (10)

プログラミングHaskell(第2章)
プログラミングHaskell(第2章)プログラミングHaskell(第2章)
プログラミングHaskell(第2章)
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
Haxe
HaxeHaxe
Haxe
 
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 

Similar to Introduction to Spray at Kansai Functional Programming

オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行guest5f4320
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Shogo Sensui
 
JAWSDAYS 2014 ACEに聞け! EMR編
JAWSDAYS 2014 ACEに聞け! EMR編JAWSDAYS 2014 ACEに聞け! EMR編
JAWSDAYS 2014 ACEに聞け! EMR編
陽平 山口
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りました
Tomoharu ASAMI
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
 
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
Nobutada Matsubara
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
stomita
 
ざっくり DDD 入門!!
ざっくり DDD 入門!!ざっくり DDD 入門!!
ざっくり DDD 入門!!
Yukei Wachi
 
Cloud computing competition by Hapyrus
Cloud computing competition by HapyrusCloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
Koichi Fujikawa
 
Dbts2015 tokyo vector_in_hadoop_vortex
Dbts2015 tokyo vector_in_hadoop_vortexDbts2015 tokyo vector_in_hadoop_vortex
Dbts2015 tokyo vector_in_hadoop_vortex
Koji Shinkubo
 

Similar to Introduction to Spray at Kansai Functional Programming (20)

オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
JAWSDAYS 2014 ACEに聞け! EMR編
JAWSDAYS 2014 ACEに聞け! EMR編JAWSDAYS 2014 ACEに聞け! EMR編
JAWSDAYS 2014 ACEに聞け! EMR編
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りました
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
ざっくり DDD 入門!!
ざっくり DDD 入門!!ざっくり DDD 入門!!
ざっくり DDD 入門!!
 
Cloud computing competition by Hapyrus
Cloud computing competition by HapyrusCloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
 
Dbts2015 tokyo vector_in_hadoop_vortex
Dbts2015 tokyo vector_in_hadoop_vortexDbts2015 tokyo vector_in_hadoop_vortex
Dbts2015 tokyo vector_in_hadoop_vortex
 

Introduction to Spray at Kansai Functional Programming