SlideShare a Scribd company logo
1 of 70
Download to read offline
オブジェクト指向開発における 
Object-Functional Programming 
2014年年11⽉月14⽇日 
Everforth 
浅海智晴
自己紹介 
• 1985年年富⼠士通(株)⼊入社 
• UNIXワークステーション/サーバーのOS、分散基盤、Web 
基盤の開発に従事 
• 2001年年9⽉月に独⽴立立 
• 浅海智晴事務所を設⽴立立 
• Java, XML, UMLを中⼼心に活動 
• 2005年年4⽉月より2007年年3⽉月まで 
• 稚内北北星学園⼤大学東京サテライト校教授 
• 現在 
• (株) 匠BusinessPlace 取締役チーフコンサルタント 
• (株) Everforth 取締役CTO
ApparelCloud 
 データを一元化することで、多様な情報を、様々なメディア・デバイスを 
通じて 
 消費者に届け、真のCRMを実現する仕組み。 
http://www.apparel-cloud.com/
ApparelCloud 
複数メディア・コンテンツを⼀一元管理理し、クオリティの統⼀一と運⽤用コストの低減を実現。 
コンテンツを⼆二重三重に登録する必要もなく、データ分析などの⼀一元化も可能。 
 
ブランド ブログ 
アプリ 
コンテンツ集計・分析 
クーポン 
ブランドサイトオンラインスト 
 
ア 
ニュースブログショップ 
ダッシュボード
ApparelCloud 
Apparel Cloud 構成概要 
ソリューション名: 
Apparel Cloud 
提供元:apparel-‐‑‒web 
C社製品D社製品 
B社製品 
Paas 
提供元:EverforthApparel Cloud 
プラットフォーム 
AWSIaaS 
提供元:Amazon 
 
ブログアプリ 
Option機能 
 
 
ショップアプリ 
ベーシック 
 
SaaS 
提供元:apparel-‐‑‒web 
:パートナー企業 
・Apparel Cloud Private Project 
特定企業向け型 
 
・Apparel Cloud 
テンプレート型 
A社製品 
5 
 
顧客情報 
Blog・ブランド・SHOP 
情報 
フォロー・LIKE情報 
クーポン情報 
商品情報 
etc 
 
ブランドアプリ 
ベーシック 
 
 
ショップアプリ 
Option機能 
 
 
ECアプリ 
メンバーアプリ 
 
情報集積(PV,フォロー・ 
like数etc……) 
 
各option 
スマートフォン・PCへの 
配信情報登録 
API(個々のアプリはAPI通信) 
 
PUSH配信
アジェンダ 
背景 
関数型プログラミング 
Monadic Programming 
Object-Functional Programming 
オブジェクト指向開発+OFP
背景
新しい現実 
ハードウェア 
• メニーコア、⼤大容量量メモリ、SSD 
• インメモリデータベース 
• 並列列プログラミング 
クラウド・プラットフォーム 
• クラウド・サービス、スマート・デバイス 
• 故障、遅延 
• ⼤大規模データ、⼤大規模演算 
• ⾼高頻度度イベント、ストリーミング 
• ⾮非同期、並列列、分散 
• NoSQL
アプリケーションの階層と役割 
• DSLの作法に従ってビジネスロ 
ジックを記述 
• OO、関数型のスキルは最低限 
アプリケー 
ション 
• フレームワークを簡単に使⽤用する 
ための専⽤用⾔言語 
• OO、関数型の⾼高度度なスキル 
DSL 
• ドメインの共通処理理を記述 
• OO、関数型の⾼高度度なスキル 
フレーム 
ワーク
プログラム開発の構造
API vs DSL
オブジェクト指向開発概観 
ドメイン・モデル 
ビジネス 
フロー 
ビジネス 
ユースケースユースケースサービス 
ビジネス・モデルシステム分析モデルシステム設計モデル
ApparelCloud 
システム構成 
Scala 
Java 
Scala 
Scala 
Scala 
Java 
Scala 
Java
Everforthの開発⼿手法 
Everforh Engine 
開発 
ビジネス・プロセス・モデル 
(Mindmap) 
アプリケーション・モデル 
(画面+API) 
ドメイン・モデル 
(テキストDSL) エンティティ(Scala) 
EverforthModeler 
Service 
(Scala) 
設定 
(S式, LTSV) 
Extension 
(Scala) 
自動コーディング 
組込みService 
(Scala) 
組込みExtension 
(Scala) 
ScalaScala 
114Kstep140Kstep
関数型プログラミング
Scala 
• 強い静的型付けジェネリック型 
• オブジェクト指向 
• Java 
• 関数型 
• ラムダ計算 
• パターンマッチング 
• モナド 
• 型クラス 
• 最新のプログラミング⾔言語技術の総合技術 
• いろいろな⾔言語の美点を貪欲に取り⼊入れている 
• DSL (Domain Specific Language) 
• 内部DSL, 外部DSLを⽀支援する機能が満載 
• JavaVM 
• 安定した実⾏行行環境 
• Java資産の活⽤用
Scala(ble) 
⼩小規模 
Webシス 
テム 
中規模 
業務シ 
ステム 
⼤大規模 
分散シ 
ステム
関数型⾔言語とは 
• ⾼高階関数を扱える。 
• 関数を値として扱える。 
• 関数の引数と返却値に関数を渡せる。 
• 関数リテラル(クロージャ)が記述できる。 
• 数学(ラムダ計算、数理理論論理理学、圏論論など)的にプログラ 
ムを記述できる。
関数型⾔言語の系譜 
元祖関数型⾔言語 
• pure Lisp 
• ラムダ計算 
伝統的関数型 
⾔言語 
• Lisp, ML, OCaml 
• ラムダ計算 
• ⼿手続き、オブジェ 
クト指向で補完 
• 抽象データ型 
• Subtype 
polymorphism 
新世代関数型 
⾔言語 
• Haskell 
• Scala(+scalaz) 
• ラムダ計算 
• 代数、圏論論 
• 型クラス 
• 代数データ型、 
モナド 
• Parametric 
polymorphism 
浅海私⾒見見。 
20年年ほどの空⽩白の後の⾒見見え⽅方、 
あるいはOOプログラマが後追い 
で調べたときの⾒見見え⽅方と考えて 
ください。
関数型⾔言語の⻑⾧長所と短所 
⻑⾧長所 
• ⾼高階関数を使った技が使える 
• List, 関数合成(コンビネータ)など 
• 定理理と証明 
• 証明された(動作保証された)定理理(関数)を積み上げてプログラ 
ムを記述できる (← 多少理理想論論も⼊入ってます) 
短所 
• 関数実⾏行行のオーバーヘッド 
• 関数オブジェクト 
• メモリを⼤大量量に消費する 
• 関数オブジェクト 
• データの⼤大量量複写 
• スタックの使⽤用量量が読めない 
• 再帰
関数型⾔言語の技術マップ
代数的構造デザインパターン 
結合律律 (associative law) 
• 半群 (semigroup) 
• モノイド (monoid) 
• 群 (group) 
可換律律 (commutative law) 
• 可換半群 
• 可換モノイド 
• 可換群(アーベル群) 
分配律律 (distributive law) 
• 環 (ring) 
• 体 (field) 
(a + b) + c = a + (b + c) 
a + b = b + a 
a * (b + c) = a * b + a * c
圏論論デザインパターン 
圏 (category) 
• Hask圏 (Scala圏?) 
• クライスリ圏 
(kleisli category) 
射 (arrow, 
morphism) 
関⼿手 
(functor) 
モナド 
(monad) 
Applicative 
functor
基本概念 
• 再帰 (recursion) 
• ⾼高階関数 (high-order function) 
• 不不変データ (immutable data) 
• 遅延評価 (lazy evaluation) 
• 参照透過性 (referential transparency) 
• (項)書換えモデル (substitution model) 
• 等式推論論 (equational reasoning) 
• 代数的データ型 (algebraic data type) 
• 直積, 直和 (direct product, direct sum) 
• 永続データ構造 (persistent data structure) 
• エフェクト (effect) 
• 型クラス (type class) 
• モナド (monad)
A → B 
• 関数の基本 
• 型Aの値を型Bの値に置き換える (置き換えモデル, 
substitution model) 
• 副作⽤用はないので、A→Bの関数の外側にいかなる影響も 
与えない (no side effect) 
• 型Aの値が同じなら、いかなるタイミングで呼び出して 
も型Bの同じ値が返る (参照透過性, referential 
transparency) 
• 論論理理学:ならば(imply) 
• 圏論論:射(arrow, morphism) 
• Readerモナド 
• def f(x: A): B
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
A → A → A 
• 「A → B → C」の特殊な形 
• A, B, Cが同じ型 
• ⼆二項演算⼦子 
• 型Aがモノイドの候補 
• f(x: A, y: A): A 
• 1 + 1 → 2 
• “abc” + “xyz” → “abcxyz” 
• List(“abc”) ++ List(“xyz”) → List(“abc”, “xyz”)
A → M[B] 
• 「A → B」の特殊な形 
• 「B」の部分が「M[B]」となっている 
• Mはモナド、モナドMがBをくるんでいる形 
• モナドのbind演算(flatMap)で使⽤用する 
• Reader Transformer(Kleisli) 
• def flatMap[A, B](f: A = List[B])
その他 
• A→A 
• Endo関数 
• Monoidとして利利⽤用可 
• S→S×A 
• Stateモナド 
• S→M[S×A] 
• State Transformer
代数的データ型 
• Algebraic data type 
• 直積 (direct product) 
• 論論理理学: ∧(論論理理積、かつ) 
• Tuple 
• Case class 
• 直和 (direct sum) 
• 論論理理学: ∨(論論理理和、または) 
• Either 
• sealed trait/abstract class + case class/case object
代数的データ型 
ケースクラスで直積を実現 
case class Person(name: String, age: Int) 
Case class Company(name: String, phone: String) 
Eitherで直積の直和を実現 
Either[Person, Company] 
sealedトレイトで直積の直和 
sealed trait Party 
case class Person(name: String, age: Int) extends Party 
case class Company(name: String, phone: String) extends Party
永続データ構造 
• Persistent data structure 
• 変更更される際に変更更前のバージョンを常に保持するデータ構造で 
ある。このようなデータ構造は、更更新の際に元のデータ構造を書 
き換えるのではなく、新たなデータ構造を⽣生成すると考えられ、 
イミュータブルなデータ構造の構築に利利⽤用可能である(Wikipedia)
型クラス 
• In computer science, a type class is a type system 
construct that supports ad hoc polymorphism. This 
is achieved by adding constraints to type variables in 
parametrically polymorphic types. (Wikipedia) 
• ⾮非公式理理解 
• OOPのクラスの関数型バージョン 
• OOPでも有効に使⽤用できる 
• OOPのクラスとの違い 
• コンパイル時にポリモーフィズムが解決される 
• 任意のクラスに後付けで設定できる 
• ⽂文脈によって切切り替えて使⽤用できる 
• Scalaでは暗黙パラメタで実現
型クラスの使⽤用例例 
case class Average(total: Double, count: Int) { 
def value = total / count 
def +(rhs: Average) = Average(total + rhs.total, count + rhs.count) 
} 
object Average { 
implicit object AverageMonoid extends Monoid[Average] { 
def append(lhs: Average, rhs: = Average) = lhs + rhs 
def zero = Average(0, 0) 
} 
}
object MonoidSample { 
import Average.AverageMonoid 
def concatenate[T: Monoid](xs: Vector[T]): T = { 
val C = implicitly[Monoid[T]] 
xs.foldLeft(C.zero)((z, x) = z |+| x) 
} 
def sample { 
val a: Int = concatenate(Vector(1, 2, 3)) 
assert(a == 6) 
val b: Average = concatenate[Average](Vector( 
Average(1.0, 1), Average(2.0, 2), Average(3.0, 3))) 
assert(b == Average(6.0, 6)) 
} 
def main(args: Array[String]) { 
sample 
} 
}
Monadic Programming
モナド 
• 計算機科学におけるモナド(Monads)とは、計算機科学者の 
Eugenio Moggiによって提案されたモジュール性を持たせた 
表⽰示的意味論論の枠組みを⾔言う。プログラムとはクライスリ圏 
の射である(a program is an arrow of a Kleisli category)、 
という要請から合成規則としてクライスリトリプル(Kleisli 
triple)というモナドと等価なものが⽤用いられる。(Wikipedia) 
• In functional programming, a monad is a structure that 
represents computations defined as sequences of steps: a 
type with a monad structure defines what it means to 
chain operations, or nest functions of that type together. 
This allows the programmer to build pipelines that 
process data in steps, in which each action is decorated 
with additional processing rules provided by the monad. 
(Wikipedia) 
• ⾮非常に難しい概念念 
• 使うのは(なれれば)それほど難しくない 
• モダンな関数型プログラミングの中核概念念
モナドの⾮非公式理理解 
• コンテナ 
• コレクション(List, Vector) 
• 成功失敗⽂文脈(Option) 
• パイプライン 
• map, filter, collect 
• flatMap 
• コマンド・インタープリタ 
• Freeモナド, Operationalモナド
代表的なモナド 
• Option 
• 成功/失敗状態を扱うモナド 
• List 
• オブジェクト列列を扱うモナド(シーケンシャルアクセス向け) 
• Vector 
• オブジェクト列列を扱うモナド(ランダムアクセス対応) 
• Stream 
• 遅延評価によるオブジェクト列列を扱うモナド 
• Try 
• 例例外発⽣生状態を扱うモナド 
• 例例外というエフェクトを隠蔽 
• Future 
• 並列列実⾏行行を扱うモナド 
• 実⾏行行時間というエフェクトを隠蔽
モナド 
• 難解な概念念 
• http://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96 
• ⾮非公式理理解 
• 型安全汎⽤用フレームワーク基底クラス
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向けに⽤用意 
• 型クラス 
• 純粋関数型データ構造
Monadicプログラミングの効⽤用 
Java⾵風 
def validate(name: String, age: Int): ValidationNEL[Throwable, (String, 
Int)] = {! 
val a = validateName(name) ! 
val b = validateAge(age) ! 
if (a.isSuccess  b.isSuccess) { ! 
val a1 = a.asInstanceOf[Success[NonEmptyList[Throwable], String]].a ! 
val b1 = b.asInstanceOf[Success[NonEmptyList[Throwable], Int]].a ! 
Success((a1, b1)) ! 
} else if (a.isSuccess) { ! 
b.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] ! 
} else if (b.isSuccess) { ! 
a.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] ! 
} else { ! 
val a1 = a.asInstanceOf[Failure[NonEmptyList[Throwable], String]].e ! 
val b1 = b.asInstanceOf[Failure[NonEmptyList[Throwable], Int]].e ! 
Failure(a1 |+| b1) ! 
} ! 
}!
Scala (関数型プログラミング) 
def validate(name: String, age: Int): 
ValidationNEL[Throwable, (String, Int)] = { ! 
validateName(name) match { ! 
case Success(a) = validateAge(age) match { ! 
case Success(b) = Success((a, b)) ! 
case Failure(e) = Failure(e) ! 
} ! 
case Failure(e1) = validateAge(age) match { ! 
case Success(b) = Failure(e1) ! 
case Failure(e2) = Failure(e1 |+| e2) ! 
} ! 
} ! 
} ! 
Scalaz (Monadicプログラミング) 
def validate(name: String, age: Int): 
ValidationNEL[Throwable, (String, Int)] = { ! 
(validateName(name) ⊛ validateAge(age))((_, _)) ! 
}! 
URL: http://modegramming.blogspot.jp/2012/04/ 
scala-tips-validation-10-applicative.html
パイプライン・プログラミング
Stateモナドによるパイプライン 
State Monad 
State Funcion Function Function 
State 
Value 
Value Value Value 
Value Value
Stateモナドの使⽤用例例 
case class Stack(stack: List[Int]) 
def main(args: Array[String]) { 
sample 
} 
def sample { 
val stack = Stack(Nil) 
val r = pipe.run(stack) 
assert(r == (Stack(List(10)), 10), s$r) 
}
val pipe: State[Stack, Int] = { 
for { 
a - push(10) 
b - push(a) 
c - pop 
} yield c 
} 
def push(x: Int) = State[Stack, Int] { s = 
(Stack(x :: s.stack), x) 
} 
def pop = State[Stack, Int] { s = 
s.stack match { 
case x :: xs = (Stack(xs), x) 
case Nil = ??? 
} 
}
並列列プログラミング 
マルチスレッド  
• 共有状態 (shared mutability) 
• 共有状態をロック ← 伝統的⽅方法 
• STM (Software Transactional Memory) 
アクター 
• 状態をアクターローカル(スレッドローカル)にする (isolating 
mutability) 
• 不不変オブジェクトによるメッセージで通信 
関数プログラミング⽅方式 
• 代数的データ型、永続データ構造 
• 不不変オブジェクト 
• モナドのメカニズムを使って並列列処理理を隠蔽
並列列プログラミングとモナド
Future case class Site(uri: String, page: String) 
def largestSite: Future[Site] = { 
for { 
a - future(getSite(http://www.yahoo.com)) 
b - future(getSite(http://www.amazon.com)) 
c - future(getSite(http://www.google.com)) 
} yield { 
Vector(a, b, c).maxBy(_.page.length) 
} 
} 
def getSite(uri: String): Site = { 
Site(uri, new URL(uri).asInput.string) 
} 
def main(args: Array[String]) { 
largestSite.onSuccess { 
case site = println(swin = ${site.uri}) 
} 
}
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 ObservableString 
// 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}) 
}
scalaz stream 
• Functional Reactive Programming 
• https://www.chrisstucchio.com/blog/2014/ 
scalaz_streaming_tutorial.html 
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) 
}
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
Object Functional 
Programming
OFP新三種の神器 
トレイト (trait) 
• mix-in 
• 型安全のAOP的な運⽤用 
モナド (monad) 
• 計算⽂文脈をカプセル化する新しい⾔言語概念念 
• Monadicプログラミング 
型クラス (type class) 
• 型安全のダブルディスパッチ(?) 
• Scalaでは、⽂文脈、主体、客体の組でオブジェクトを束縛
関数と⼿手続き 
• 関数は副作⽤用なし 
• 副作⽤用があるものは「⼿手続き」 
• 例例外も副作⽤用の⼀一種 
• 厳密には例例外を発⽣生させる可能性のあるものは「⼿手続き」 
• プログラミングの⼿手間を考えて例例外は特別扱いしたい 
• 本セッションでは「準関数」を導⼊入 
要素副作⽤用なし参照透過性例例外なし 
関数◯◯◯ 
準関数◯◯× 
⼿手続きーーー
OOP/FP⽐比較
オブジェクトと関数の連携
DSL (Domain Specific Language) 
• 固有の目的別言語 (汎⽤用⾔言語の反対) 
• 内部DSL 
• 汎⽤用⾔言語の⽂文法を拡張して実現したDSL 
• パーサーを書く必要がない 
• ホスト⾔言語の機能を使うことができる(計算式など) 
• 外部DSL 
• 専⽤用⾔言語を設計・実装 
• パーサーを書く必要がある 
• XMLやS式のようなメタ⾔言語を使う⽅方法もある 
• Scala 
• 内部DSLとしての利利⽤用を指向
DSL 
Anorm 
SQL(select name from coffees where price  10.0”) 
Squeryl 
from(coffees)(s = 
where(s.price  10.0) 
select(s)) 
Slick 
coffees.filter(_.price  10.0).map(_.name)
DSL 
def transaction[T](body: = T) = { 
val tx = openTransaction() 
try { 
body 
} finally { 
closeTransaction(tx) 
} 
} 
case class Conditional[T](p: Boolean, truebody: () = T) { 
def myelse(falsebody: = T): T = if (p) truebody() else falsebody 
} 
def myif[T](p: Boolean)(truebody: = T): Conditional[T] = 
new Conditional(p, () = truebody)
def sample(v: Boolean): Boolean = { 
transaction { 
myif (v) { 
true 
} myelse { 
false 
} 
} 
}
オブジェクト指向開発+OFP
オブジェクト指向開発概観 
ドメイン・モデル 
ビジネス 
フロー 
ビジネス 
ユースケースユースケースサービス 
ビジネス・モデルシステム分析モデルシステム設計モデル
モデル&アーキテクチャ: 
⼿手続き指向
モデル&アーキテクチャ: 
オブジェクト指向
モデル&アーキテクチャ 
関数型指向
データフロー 
• OMT v1 (1991) 
• Object model 
• Dynamic model 
• Functional model 
• データフロー 
• OMT v2 (2005) 
• Class model 
• Dynamic model 
• Interaction model 
• データフローでモデリングしたいもの 
• バッチ処理理 
• BigData
まとめ 
• 関数型⾔言語の導⼊入の意義 
• 開発効率率率 
• DSL 
• Monadic Programming 
• 並列列・並⾏行行・分散 
• Functional Reactive Programming 
• OFP (Object-Functional Programming) 
• DSL 
• OP : FP = 6 : 4 (体感値) 
• オブジェクト指向開発 + OFP 
• DSL 
• サービス 
• データフロー
END

More Related Content

What's hot

Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくHiromi Ishii
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行guest5f4320
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0Kenji Yoshida
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編takeuchi-tk
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPIAkihiro Ikezoe
 
すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)Suguru Hamazaki
 
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化Lintaro Ina
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門yujiro_t
 

What's hot (20)

Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
Scalaノススメ
ScalaノススメScalaノススメ
Scalaノススメ
 
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
Scalaz
ScalazScalaz
Scalaz
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
 
すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)
 
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 

Viewers also liked

MindmapModelingチュートリアル
MindmapModelingチュートリアルMindmapModelingチュートリアル
MindmapModelingチュートリアルTomoharu ASAMI
 
楽々Scalaプログラミング
楽々Scalaプログラミング楽々Scalaプログラミング
楽々ScalaプログラミングTomoharu ASAMI
 
Monadicプログラミング マニアックス
Monadicプログラミング マニアックスMonadicプログラミング マニアックス
Monadicプログラミング マニアックスTomoharu ASAMI
 
Terraformでオーケストレーションを統一する
Terraformでオーケストレーションを統一するTerraformでオーケストレーションを統一する
Terraformでオーケストレーションを統一するgu4
 
Prefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャPrefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャTomoharu ASAMI
 
2014 akka-streams-tokyo-japanese
2014 akka-streams-tokyo-japanese2014 akka-streams-tokyo-japanese
2014 akka-streams-tokyo-japaneseKonrad Malawski
 
Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)Tomer Gabel
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチTomoharu ASAMI
 

Viewers also liked (8)

MindmapModelingチュートリアル
MindmapModelingチュートリアルMindmapModelingチュートリアル
MindmapModelingチュートリアル
 
楽々Scalaプログラミング
楽々Scalaプログラミング楽々Scalaプログラミング
楽々Scalaプログラミング
 
Monadicプログラミング マニアックス
Monadicプログラミング マニアックスMonadicプログラミング マニアックス
Monadicプログラミング マニアックス
 
Terraformでオーケストレーションを統一する
Terraformでオーケストレーションを統一するTerraformでオーケストレーションを統一する
Terraformでオーケストレーションを統一する
 
Prefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャPrefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャ
 
2014 akka-streams-tokyo-japanese
2014 akka-streams-tokyo-japanese2014 akka-streams-tokyo-japanese
2014 akka-streams-tokyo-japanese
 
Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
 

Similar to オブジェクト指向開発におけるObject-Functional Programming

Introduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingSuguru Hamazaki
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Akira Inoue
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
Scala による自然言語処理
Scala による自然言語処理Scala による自然言語処理
Scala による自然言語処理Hiroyoshi Komatsu
 
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ  クラウド時代のモデリングを考えるオブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ  クラウド時代のモデリングを考える
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考えるTomoharu ASAMI
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについてNobukazu Hanada
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2Java8 lambdas chapter1_2
Java8 lambdas chapter1_2yo0824
 
[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear AlgebraYuichi Adachi
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common LispIntegral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lispfukamachi
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するTakahito Tejima
 

Similar to オブジェクト指向開発におけるObject-Functional Programming (20)

Introduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional Programming
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
Scala による自然言語処理
Scala による自然言語処理Scala による自然言語処理
Scala による自然言語処理
 
Sphinx/reST
Sphinx/reSTSphinx/reST
Sphinx/reST
 
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ  クラウド時代のモデリングを考えるオブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ  クラウド時代のモデリングを考える
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
 
LDA入門
LDA入門LDA入門
LDA入門
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
 
[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common LispIntegral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lisp
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 

More from Tomoharu ASAMI

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】Tomoharu ASAMI
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】Tomoharu ASAMI
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】Tomoharu ASAMI
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】Tomoharu ASAMI
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】Tomoharu ASAMI
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】Tomoharu ASAMI
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】Tomoharu ASAMI
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】Tomoharu ASAMI
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】Tomoharu ASAMI
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】Tomoharu ASAMI
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】Tomoharu ASAMI
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】Tomoharu ASAMI
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】Tomoharu ASAMI
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】Tomoharu ASAMI
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】Tomoharu ASAMI
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】Tomoharu ASAMI
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】Tomoharu ASAMI
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】Tomoharu ASAMI
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】Tomoharu ASAMI
 

More from Tomoharu ASAMI (20)

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
 

Recently uploaded

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (9)

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

オブジェクト指向開発におけるObject-Functional Programming

  • 1. オブジェクト指向開発における Object-Functional Programming 2014年年11⽉月14⽇日 Everforth 浅海智晴
  • 2. 自己紹介 • 1985年年富⼠士通(株)⼊入社 • UNIXワークステーション/サーバーのOS、分散基盤、Web 基盤の開発に従事 • 2001年年9⽉月に独⽴立立 • 浅海智晴事務所を設⽴立立 • Java, XML, UMLを中⼼心に活動 • 2005年年4⽉月より2007年年3⽉月まで • 稚内北北星学園⼤大学東京サテライト校教授 • 現在 • (株) 匠BusinessPlace 取締役チーフコンサルタント • (株) Everforth 取締役CTO
  • 3. ApparelCloud  データを一元化することで、多様な情報を、様々なメディア・デバイスを 通じて  消費者に届け、真のCRMを実現する仕組み。 http://www.apparel-cloud.com/
  • 4. ApparelCloud 複数メディア・コンテンツを⼀一元管理理し、クオリティの統⼀一と運⽤用コストの低減を実現。 コンテンツを⼆二重三重に登録する必要もなく、データ分析などの⼀一元化も可能。 ブランド ブログ アプリ コンテンツ集計・分析 クーポン ブランドサイトオンラインスト ア ニュースブログショップ ダッシュボード
  • 5. ApparelCloud Apparel Cloud 構成概要 ソリューション名: Apparel Cloud 提供元:apparel-‐‑‒web C社製品D社製品 B社製品 Paas 提供元:EverforthApparel Cloud プラットフォーム AWSIaaS 提供元:Amazon ブログアプリ Option機能 ショップアプリ ベーシック SaaS 提供元:apparel-‐‑‒web :パートナー企業 ・Apparel Cloud Private Project 特定企業向け型 ・Apparel Cloud テンプレート型 A社製品 5 顧客情報 Blog・ブランド・SHOP 情報 フォロー・LIKE情報 クーポン情報 商品情報 etc ブランドアプリ ベーシック ショップアプリ Option機能 ECアプリ メンバーアプリ 情報集積(PV,フォロー・ like数etc……) 各option スマートフォン・PCへの 配信情報登録 API(個々のアプリはAPI通信) PUSH配信
  • 6. アジェンダ 背景 関数型プログラミング Monadic Programming Object-Functional Programming オブジェクト指向開発+OFP
  • 8. 新しい現実 ハードウェア • メニーコア、⼤大容量量メモリ、SSD • インメモリデータベース • 並列列プログラミング クラウド・プラットフォーム • クラウド・サービス、スマート・デバイス • 故障、遅延 • ⼤大規模データ、⼤大規模演算 • ⾼高頻度度イベント、ストリーミング • ⾮非同期、並列列、分散 • NoSQL
  • 9. アプリケーションの階層と役割 • DSLの作法に従ってビジネスロ ジックを記述 • OO、関数型のスキルは最低限 アプリケー ション • フレームワークを簡単に使⽤用する ための専⽤用⾔言語 • OO、関数型の⾼高度度なスキル DSL • ドメインの共通処理理を記述 • OO、関数型の⾼高度度なスキル フレーム ワーク
  • 12. オブジェクト指向開発概観 ドメイン・モデル ビジネス フロー ビジネス ユースケースユースケースサービス ビジネス・モデルシステム分析モデルシステム設計モデル
  • 13. ApparelCloud システム構成 Scala Java Scala Scala Scala Java Scala Java
  • 14. Everforthの開発⼿手法 Everforh Engine 開発 ビジネス・プロセス・モデル (Mindmap) アプリケーション・モデル (画面+API) ドメイン・モデル (テキストDSL) エンティティ(Scala) EverforthModeler Service (Scala) 設定 (S式, LTSV) Extension (Scala) 自動コーディング 組込みService (Scala) 組込みExtension (Scala) ScalaScala 114Kstep140Kstep
  • 16. Scala • 強い静的型付けジェネリック型 • オブジェクト指向 • Java • 関数型 • ラムダ計算 • パターンマッチング • モナド • 型クラス • 最新のプログラミング⾔言語技術の総合技術 • いろいろな⾔言語の美点を貪欲に取り⼊入れている • DSL (Domain Specific Language) • 内部DSL, 外部DSLを⽀支援する機能が満載 • JavaVM • 安定した実⾏行行環境 • Java資産の活⽤用
  • 17. Scala(ble) ⼩小規模 Webシス テム 中規模 業務シ ステム ⼤大規模 分散シ ステム
  • 18. 関数型⾔言語とは • ⾼高階関数を扱える。 • 関数を値として扱える。 • 関数の引数と返却値に関数を渡せる。 • 関数リテラル(クロージャ)が記述できる。 • 数学(ラムダ計算、数理理論論理理学、圏論論など)的にプログラ ムを記述できる。
  • 19. 関数型⾔言語の系譜 元祖関数型⾔言語 • pure Lisp • ラムダ計算 伝統的関数型 ⾔言語 • Lisp, ML, OCaml • ラムダ計算 • ⼿手続き、オブジェ クト指向で補完 • 抽象データ型 • Subtype polymorphism 新世代関数型 ⾔言語 • Haskell • Scala(+scalaz) • ラムダ計算 • 代数、圏論論 • 型クラス • 代数データ型、 モナド • Parametric polymorphism 浅海私⾒見見。 20年年ほどの空⽩白の後の⾒見見え⽅方、 あるいはOOプログラマが後追い で調べたときの⾒見見え⽅方と考えて ください。
  • 20. 関数型⾔言語の⻑⾧長所と短所 ⻑⾧長所 • ⾼高階関数を使った技が使える • List, 関数合成(コンビネータ)など • 定理理と証明 • 証明された(動作保証された)定理理(関数)を積み上げてプログラ ムを記述できる (← 多少理理想論論も⼊入ってます) 短所 • 関数実⾏行行のオーバーヘッド • 関数オブジェクト • メモリを⼤大量量に消費する • 関数オブジェクト • データの⼤大量量複写 • スタックの使⽤用量量が読めない • 再帰
  • 22. 代数的構造デザインパターン 結合律律 (associative law) • 半群 (semigroup) • モノイド (monoid) • 群 (group) 可換律律 (commutative law) • 可換半群 • 可換モノイド • 可換群(アーベル群) 分配律律 (distributive law) • 環 (ring) • 体 (field) (a + b) + c = a + (b + c) a + b = b + a a * (b + c) = a * b + a * c
  • 23. 圏論論デザインパターン 圏 (category) • Hask圏 (Scala圏?) • クライスリ圏 (kleisli category) 射 (arrow, morphism) 関⼿手 (functor) モナド (monad) Applicative functor
  • 24. 基本概念 • 再帰 (recursion) • ⾼高階関数 (high-order function) • 不不変データ (immutable data) • 遅延評価 (lazy evaluation) • 参照透過性 (referential transparency) • (項)書換えモデル (substitution model) • 等式推論論 (equational reasoning) • 代数的データ型 (algebraic data type) • 直積, 直和 (direct product, direct sum) • 永続データ構造 (persistent data structure) • エフェクト (effect) • 型クラス (type class) • モナド (monad)
  • 25. A → B • 関数の基本 • 型Aの値を型Bの値に置き換える (置き換えモデル, substitution model) • 副作⽤用はないので、A→Bの関数の外側にいかなる影響も 与えない (no side effect) • 型Aの値が同じなら、いかなるタイミングで呼び出して も型Bの同じ値が返る (参照透過性, referential transparency) • 論論理理学:ならば(imply) • 圏論論:射(arrow, morphism) • Readerモナド • def f(x: A): B
  • 26. 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
  • 27. A → A → A • 「A → B → C」の特殊な形 • A, B, Cが同じ型 • ⼆二項演算⼦子 • 型Aがモノイドの候補 • f(x: A, y: A): A • 1 + 1 → 2 • “abc” + “xyz” → “abcxyz” • List(“abc”) ++ List(“xyz”) → List(“abc”, “xyz”)
  • 28. A → M[B] • 「A → B」の特殊な形 • 「B」の部分が「M[B]」となっている • Mはモナド、モナドMがBをくるんでいる形 • モナドのbind演算(flatMap)で使⽤用する • Reader Transformer(Kleisli) • def flatMap[A, B](f: A = List[B])
  • 29. その他 • A→A • Endo関数 • Monoidとして利利⽤用可 • S→S×A • Stateモナド • S→M[S×A] • State Transformer
  • 30. 代数的データ型 • Algebraic data type • 直積 (direct product) • 論論理理学: ∧(論論理理積、かつ) • Tuple • Case class • 直和 (direct sum) • 論論理理学: ∨(論論理理和、または) • Either • sealed trait/abstract class + case class/case object
  • 31. 代数的データ型 ケースクラスで直積を実現 case class Person(name: String, age: Int) Case class Company(name: String, phone: String) Eitherで直積の直和を実現 Either[Person, Company] sealedトレイトで直積の直和 sealed trait Party case class Person(name: String, age: Int) extends Party case class Company(name: String, phone: String) extends Party
  • 32. 永続データ構造 • Persistent data structure • 変更更される際に変更更前のバージョンを常に保持するデータ構造で ある。このようなデータ構造は、更更新の際に元のデータ構造を書 き換えるのではなく、新たなデータ構造を⽣生成すると考えられ、 イミュータブルなデータ構造の構築に利利⽤用可能である(Wikipedia)
  • 33. 型クラス • In computer science, a type class is a type system construct that supports ad hoc polymorphism. This is achieved by adding constraints to type variables in parametrically polymorphic types. (Wikipedia) • ⾮非公式理理解 • OOPのクラスの関数型バージョン • OOPでも有効に使⽤用できる • OOPのクラスとの違い • コンパイル時にポリモーフィズムが解決される • 任意のクラスに後付けで設定できる • ⽂文脈によって切切り替えて使⽤用できる • Scalaでは暗黙パラメタで実現
  • 34. 型クラスの使⽤用例例 case class Average(total: Double, count: Int) { def value = total / count def +(rhs: Average) = Average(total + rhs.total, count + rhs.count) } object Average { implicit object AverageMonoid extends Monoid[Average] { def append(lhs: Average, rhs: = Average) = lhs + rhs def zero = Average(0, 0) } }
  • 35. object MonoidSample { import Average.AverageMonoid def concatenate[T: Monoid](xs: Vector[T]): T = { val C = implicitly[Monoid[T]] xs.foldLeft(C.zero)((z, x) = z |+| x) } def sample { val a: Int = concatenate(Vector(1, 2, 3)) assert(a == 6) val b: Average = concatenate[Average](Vector( Average(1.0, 1), Average(2.0, 2), Average(3.0, 3))) assert(b == Average(6.0, 6)) } def main(args: Array[String]) { sample } }
  • 37. モナド • 計算機科学におけるモナド(Monads)とは、計算機科学者の Eugenio Moggiによって提案されたモジュール性を持たせた 表⽰示的意味論論の枠組みを⾔言う。プログラムとはクライスリ圏 の射である(a program is an arrow of a Kleisli category)、 という要請から合成規則としてクライスリトリプル(Kleisli triple)というモナドと等価なものが⽤用いられる。(Wikipedia) • In functional programming, a monad is a structure that represents computations defined as sequences of steps: a type with a monad structure defines what it means to chain operations, or nest functions of that type together. This allows the programmer to build pipelines that process data in steps, in which each action is decorated with additional processing rules provided by the monad. (Wikipedia) • ⾮非常に難しい概念念 • 使うのは(なれれば)それほど難しくない • モダンな関数型プログラミングの中核概念念
  • 38. モナドの⾮非公式理理解 • コンテナ • コレクション(List, Vector) • 成功失敗⽂文脈(Option) • パイプライン • map, filter, collect • flatMap • コマンド・インタープリタ • Freeモナド, Operationalモナド
  • 39. 代表的なモナド • Option • 成功/失敗状態を扱うモナド • List • オブジェクト列列を扱うモナド(シーケンシャルアクセス向け) • Vector • オブジェクト列列を扱うモナド(ランダムアクセス対応) • Stream • 遅延評価によるオブジェクト列列を扱うモナド • Try • 例例外発⽣生状態を扱うモナド • 例例外というエフェクトを隠蔽 • Future • 並列列実⾏行行を扱うモナド • 実⾏行行時間というエフェクトを隠蔽
  • 40. モナド • 難解な概念念 • http://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96 • ⾮非公式理理解 • 型安全汎⽤用フレームワーク基底クラス
  • 41. 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向けに⽤用意 • 型クラス • 純粋関数型データ構造
  • 42. Monadicプログラミングの効⽤用 Java⾵風 def validate(name: String, age: Int): ValidationNEL[Throwable, (String, Int)] = {! val a = validateName(name) ! val b = validateAge(age) ! if (a.isSuccess b.isSuccess) { ! val a1 = a.asInstanceOf[Success[NonEmptyList[Throwable], String]].a ! val b1 = b.asInstanceOf[Success[NonEmptyList[Throwable], Int]].a ! Success((a1, b1)) ! } else if (a.isSuccess) { ! b.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] ! } else if (b.isSuccess) { ! a.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] ! } else { ! val a1 = a.asInstanceOf[Failure[NonEmptyList[Throwable], String]].e ! val b1 = b.asInstanceOf[Failure[NonEmptyList[Throwable], Int]].e ! Failure(a1 |+| b1) ! } ! }!
  • 43. Scala (関数型プログラミング) def validate(name: String, age: Int): ValidationNEL[Throwable, (String, Int)] = { ! validateName(name) match { ! case Success(a) = validateAge(age) match { ! case Success(b) = Success((a, b)) ! case Failure(e) = Failure(e) ! } ! case Failure(e1) = validateAge(age) match { ! case Success(b) = Failure(e1) ! case Failure(e2) = Failure(e1 |+| e2) ! } ! } ! } ! Scalaz (Monadicプログラミング) def validate(name: String, age: Int): ValidationNEL[Throwable, (String, Int)] = { ! (validateName(name) ⊛ validateAge(age))((_, _)) ! }! URL: http://modegramming.blogspot.jp/2012/04/ scala-tips-validation-10-applicative.html
  • 45. Stateモナドによるパイプライン State Monad State Funcion Function Function State Value Value Value Value Value Value
  • 46. Stateモナドの使⽤用例例 case class Stack(stack: List[Int]) def main(args: Array[String]) { sample } def sample { val stack = Stack(Nil) val r = pipe.run(stack) assert(r == (Stack(List(10)), 10), s$r) }
  • 47. val pipe: State[Stack, Int] = { for { a - push(10) b - push(a) c - pop } yield c } def push(x: Int) = State[Stack, Int] { s = (Stack(x :: s.stack), x) } def pop = State[Stack, Int] { s = s.stack match { case x :: xs = (Stack(xs), x) case Nil = ??? } }
  • 48. 並列列プログラミング マルチスレッド • 共有状態 (shared mutability) • 共有状態をロック ← 伝統的⽅方法 • STM (Software Transactional Memory) アクター • 状態をアクターローカル(スレッドローカル)にする (isolating mutability) • 不不変オブジェクトによるメッセージで通信 関数プログラミング⽅方式 • 代数的データ型、永続データ構造 • 不不変オブジェクト • モナドのメカニズムを使って並列列処理理を隠蔽
  • 50. Future case class Site(uri: String, page: String) def largestSite: Future[Site] = { for { a - future(getSite(http://www.yahoo.com)) b - future(getSite(http://www.amazon.com)) c - future(getSite(http://www.google.com)) } yield { Vector(a, b, c).maxBy(_.page.length) } } def getSite(uri: String): Site = { Site(uri, new URL(uri).asInput.string) } def main(args: Array[String]) { largestSite.onSuccess { case site = println(swin = ${site.uri}) } }
  • 51. 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 ObservableString // 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}) }
  • 52. scalaz stream • Functional Reactive Programming • https://www.chrisstucchio.com/blog/2014/ scalaz_streaming_tutorial.html 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) }
  • 53. 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
  • 55. OFP新三種の神器 トレイト (trait) • mix-in • 型安全のAOP的な運⽤用 モナド (monad) • 計算⽂文脈をカプセル化する新しい⾔言語概念念 • Monadicプログラミング 型クラス (type class) • 型安全のダブルディスパッチ(?) • Scalaでは、⽂文脈、主体、客体の組でオブジェクトを束縛
  • 56. 関数と⼿手続き • 関数は副作⽤用なし • 副作⽤用があるものは「⼿手続き」 • 例例外も副作⽤用の⼀一種 • 厳密には例例外を発⽣生させる可能性のあるものは「⼿手続き」 • プログラミングの⼿手間を考えて例例外は特別扱いしたい • 本セッションでは「準関数」を導⼊入 要素副作⽤用なし参照透過性例例外なし 関数◯◯◯ 準関数◯◯× ⼿手続きーーー
  • 59. DSL (Domain Specific Language) • 固有の目的別言語 (汎⽤用⾔言語の反対) • 内部DSL • 汎⽤用⾔言語の⽂文法を拡張して実現したDSL • パーサーを書く必要がない • ホスト⾔言語の機能を使うことができる(計算式など) • 外部DSL • 専⽤用⾔言語を設計・実装 • パーサーを書く必要がある • XMLやS式のようなメタ⾔言語を使う⽅方法もある • Scala • 内部DSLとしての利利⽤用を指向
  • 60. DSL Anorm SQL(select name from coffees where price 10.0”) Squeryl from(coffees)(s = where(s.price 10.0) select(s)) Slick coffees.filter(_.price 10.0).map(_.name)
  • 61. DSL def transaction[T](body: = T) = { val tx = openTransaction() try { body } finally { closeTransaction(tx) } } case class Conditional[T](p: Boolean, truebody: () = T) { def myelse(falsebody: = T): T = if (p) truebody() else falsebody } def myif[T](p: Boolean)(truebody: = T): Conditional[T] = new Conditional(p, () = truebody)
  • 62. def sample(v: Boolean): Boolean = { transaction { myif (v) { true } myelse { false } } }
  • 64. オブジェクト指向開発概観 ドメイン・モデル ビジネス フロー ビジネス ユースケースユースケースサービス ビジネス・モデルシステム分析モデルシステム設計モデル
  • 68. データフロー • OMT v1 (1991) • Object model • Dynamic model • Functional model • データフロー • OMT v2 (2005) • Class model • Dynamic model • Interaction model • データフローでモデリングしたいもの • バッチ処理理 • BigData
  • 69. まとめ • 関数型⾔言語の導⼊入の意義 • 開発効率率率 • DSL • Monadic Programming • 並列列・並⾏行行・分散 • Functional Reactive Programming • OFP (Object-Functional Programming) • DSL • OP : FP = 6 : 4 (体感値) • オブジェクト指向開発 + OFP • DSL • サービス • データフロー
  • 70. END