functional and algebraic domain modeling
TRANSCRIPT
![Page 1: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/1.jpg)
Functional and Algebraic Domain Modeling
Debasish Ghosh@debasishg
関数型、代数的なドメイン・モデリングの方法
Saturday, 30 January 16
![Page 2: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/2.jpg)
Domain Modeling
ドメイン・モデリング
Saturday, 30 January 16
![Page 3: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/3.jpg)
Domain Modeling(Functional)
関数型なドメイン・モデリング
Saturday, 30 January 16
![Page 4: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/4.jpg)
What is a domain model ?
A domain model in problem solving and software engineering is a conceptual model of all the topics related to a specific problem. It describes the various entities, their attributes, roles, and relationships, plus the constraints that govern the problem domain. It does not describe the solutions to the problem.
Wikipedia (http://en.wikipedia.org/wiki/Domain_model)
特定の問題領域に関する概念モデルエンティティ/関連/制約などを記述Saturday, 30 January 16
![Page 5: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/5.jpg)
The Functional Lens ..
“domain API evolution through algebraic composition”
関数型レンズ代数的合成を通じたドメイン API の進化Saturday, 30 January 16
![Page 6: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/6.jpg)
「サーバを関数として考える」
Saturday, 30 January 16
![Page 7: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/7.jpg)
Twitter 社でのサーバソフトウェアの構成は fp と同じ理念(不変性、関数の合成、副作用の分離)に基づくSaturday, 30 January 16
![Page 8: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/8.jpg)
Your domain model is a function
ドメインモデルは関数である
Saturday, 30 January 16
![Page 9: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/9.jpg)
Your domain model is a function
ドメインモデルは関数(...であって欲しい)
Saturday, 30 January 16
![Page 10: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/10.jpg)
Your domain model is a collection of functions
ドメインモデルは関数の集合である
Saturday, 30 January 16
![Page 11: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/11.jpg)
Your domain model is a collection of functions
some simpler models are ..
具体例で考えると...
Saturday, 30 January 16
![Page 12: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/12.jpg)
https://msdn.microsoft.com/en-us/library/jj591560.aspx
カンファレンス管理システム
Saturday, 30 January 16
![Page 13: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/13.jpg)
A Bounded Context
• has a consistent vocabulary
• a set of domain behaviors modeled as functions on domain objects implemented as types
• related behaviors grouped as modules
境界づけられたコンテキストは、統一された語彙を持つドメインの振る舞いは関数、オブジェクトは型として実装するSaturday, 30 January 16
![Page 14: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/14.jpg)
Domain Model = ∪(i) Bounded Context(i)
Saturday, 30 January 16
![Page 15: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/15.jpg)
Domain Model = ∪(i) Bounded Context(i)
Bounded Context = { f(x) | p(x) ∈ Domain Rules }
Saturday, 30 January 16
![Page 16: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/16.jpg)
Domain Model = ∪(i) Bounded Context(i)
Bounded Context = { f(x) | p(x) ∈ Domain Rules }
• domain function• on an object of type x• composes with other functions• closed under composition
• business rules
f はドメイン関数で、他の関数と合成できるp はビジネスルールSaturday, 30 January 16
![Page 17: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/17.jpg)
• Functions / Morphisms
• Types / Sets
• Composition
• Rules / Laws
関数と射、型と集合、合成、ルールと法則
Saturday, 30 January 16
![Page 18: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/18.jpg)
• Functions / Morphisms
• Types / Sets
• Composition
• Rules / Laws algebra要は代数ということ
Saturday, 30 January 16
![Page 19: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/19.jpg)
Domain Model Algebra
ドメインモデルの代数
Saturday, 30 January 16
![Page 20: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/20.jpg)
Domain Model Algebra
(algebra of types, functions & laws)
型と関数と法則の代数
Saturday, 30 January 16
![Page 21: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/21.jpg)
Domain Model Algebra
(algebra of types, functions & laws)
explicit• types• type constraints• expression in terms of other generic algebra
これを明示的にすると、型、型の制約、他の代数を用いた表現
Saturday, 30 January 16
![Page 22: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/22.jpg)
Domain Model Algebra
(algebra of types, functions & laws)
explicit verifiable• types• type constraints• expr in terms of other generic algebra
• type constraints• more constraints if you have DT• algebraic property based testing
確認可能なのは型制約、代数的プロパティーベースのテスト依存型があればより強い制約を検証できるSaturday, 30 January 16
![Page 23: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/23.jpg)
Problem Domain
問題ドメインの例として証券取引口座を考察する
Saturday, 30 January 16
![Page 24: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/24.jpg)
Bank
Account
Trade
Customer
......
...
Problem Domain
...
entities
エンティティとなるのは、口座、顧客、取引、銀行
Saturday, 30 January 16
![Page 25: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/25.jpg)
Bank
Account
Trade
Customer
......
...
do trade
process execution
place order
Problem Domain
...
entities
behaviors
振る舞いとなるのは、注文、取引、執行処理
Saturday, 30 January 16
![Page 26: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/26.jpg)
Bank
Account
Trade
Customer
......
...
do trade
process execution
place order
Problem Domain
...
market regulations
tax laws
brokerage commission
rates
...
entities
behaviors
laws
法則となるのは株式市場規則、税法、手数料
Saturday, 30 January 16
![Page 27: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/27.jpg)
do trade
process execution
place order
Solution Domain
...
behaviorsFunctions
(Type => Type)
ソリューションドメインでは、振る舞いは関数 (型 ⇒ 型)
Saturday, 30 January 16
![Page 28: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/28.jpg)
Bank
Account
Trade
Customer
......
...
do trade
process execution
place order
Solution Domain
...
entities
behaviorsfunctions
(Type => Type)
algebraic data type
エンティティは代数的データ型
Saturday, 30 January 16
![Page 29: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/29.jpg)
Bank
Account
Trade
Customer
......
...
do trade
process execution
place order
Solution Domain
...
market regulations
tax laws
brokerage commission
rates
...
entities
behaviors
laws
functions(Type => Type)
algebraic data type business rules / invariants
法則はビジネス・ルールもしくは不変関係
Saturday, 30 January 16
![Page 30: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/30.jpg)
Bank
Account
Trade
Customer
......
...
do trade
process execution
place order
Solution Domain
...
market regulations
tax laws
brokerage commission
rates
...
entities
behaviors
laws
functions(Type => Type)
algebraic data type business rules / invariants
Monoid
Monad
...
モノイドやモナドといった型クラス
Saturday, 30 January 16
![Page 31: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/31.jpg)
Bank
Account
Trade
Customer
......
...
do trade
process execution
place order
Solution Domain
...
market regulations
tax laws
brokerage commission
rates
...
entities
behaviors
laws
functions(Type => Type)
algebraic data type business rules / invariants
Monoid
Monad
...
これを全部やるとドメイン代数
Domain Algebra
Saturday, 30 January 16
![Page 32: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/32.jpg)
Domain Model = ∪(i) Bounded Context(i)
Bounded Context = { f(x) | p(x) ∈ Domain Rules }
• domain function• on an object of type x• composes with other functions• closed under composition
• business rules
Domain Algebra
Domain Algebra
「境界づけられたコンテキスト」はドメイン代数のこと
Saturday, 30 January 16
![Page 33: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/33.jpg)
Client places order- flexible format
1
クライアントが注文を出すフォーマットは様々Saturday, 30 January 16
![Page 34: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/34.jpg)
Client places order- flexible format
Transform to internal domainmodel entity and place for execution
1 2
内部でのドメインモデルエンティティに変換して、実際に注文を出すSaturday, 30 January 16
![Page 35: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/35.jpg)
Client places order- flexible format
Transform to internal domainmodel entity and place for execution
Trade & Allocate toclient accounts
1 2
3
取引し、結果をクライアントのアカウントに紐づける
Saturday, 30 January 16
![Page 36: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/36.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute: Market => Account => Order => List[Execution]
def allocate: List[Account] => Execution => List[Trade]
Saturday, 30 January 16
![Page 37: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/37.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute[Account <: BrokerAccount]: Market => Account => Order => List[Execution]
def allocate[Account <: TradingAccount]: List[Account] => Execution => List[Trade]
Saturday, 30 January 16
![Page 38: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/38.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute: Market => Account => Order => List[Execution]
def allocate: List[Account] => Execution => List[Trade]
Types out of thin air No implementation till now
Type names resonate domain language
どこからともなく降ってきた型。今の所実装の話はゼロ。型の名前はドメイン言語を反映Saturday, 30 January 16
![Page 39: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/39.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute: Market => Account => Order => List[Execution]
def allocate: List[Account] => Execution => List[Trade]
• Types (domain entities)• Functions operating on types (domain behaviors)• Laws (business rules)
型 (エンティティ)、関数 (ドメインの振る舞い)、法則 (ビジネス・ルール)Saturday, 30 January 16
![Page 40: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/40.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute: Market => Account => Order => List[Execution]
def allocate: List[Account] => Execution => List[Trade]
• Types (domain entities)• Functions operating on types (domain behaviors)• Laws (business rules)
Algebra of the API
これが API の代数
Saturday, 30 January 16
![Page 41: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/41.jpg)
trait Trading[Account, Trade, ClientOrderSheet, Order, Execution, Market] {
def clientOrders: ClientOrderSheet => List[Order]
def execute: Market => Account => Order => List[Execution]
def allocate: List[Account] => Execution => List[Trade]
def tradeGeneration(market: Market, broker: Account, clientAccounts: List[Account]) = ???}
parameterized on typesmodule
モジュール、型パラメータ
Saturday, 30 January 16
![Page 42: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/42.jpg)
Algebraic Design• The algebra is the binding contract of the
API
• Implementation is NOT part of the algebra
• An algebra can have multiple interpreters (aka implementations)
• One of the core principles of functional programming is to decouple the algebra from the interpreter
代数的設計手法: 代数は API が準拠する制約実装は代数に含まれず、実装からは分離されているSaturday, 30 January 16
![Page 43: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/43.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute: Market => Account => Order => List[Execution]
def allocate: List[Account] => Execution => List[Trade]
let’s do some algebra ..
代数の練習
Saturday, 30 January 16
![Page 44: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/44.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute(m: Market, broker: Account): Order => List[Execution]
def allocate(accounts: List[Account]): Execution => List[Trade]
let’s do some algebra ..
Saturday, 30 January 16
![Page 45: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/45.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute(m: Market, broker: Account): Order => List[Execution]
def allocate(accounts: List[Account]): Execution => List[Trade]
let’s do some algebra ..
Saturday, 30 January 16
![Page 46: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/46.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute(m: Market, broker: Account): Order => List[Execution]
def allocate(accounts: List[Account]): Execution => List[Trade]
let’s do some algebra ..
Saturday, 30 January 16
![Page 47: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/47.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute(m: Market, broker: Account): Order => List[Execution]
def allocate(accounts: List[Account]): Execution => List[Trade]
let’s do some algebra ..
Saturday, 30 January 16
![Page 48: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/48.jpg)
def clientOrders: ClientOrderSheet => List[Order]
def execute(m: Market, broker: Account): Order => List[Execution]
def allocate(accounts: List[Account]): Execution => List[Trade]
let’s do some algebra ..
Saturday, 30 January 16
![Page 49: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/49.jpg)
def f: A => List[B]
def g: B => List[C]
def h: C => List[D]
.. a problem of composition ..
これは ... 合成の問題だ
Saturday, 30 January 16
![Page 50: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/50.jpg)
.. a problem of composition with effects ..
def f: A => List[B]
def g: B => List[C]
def h: C => List[D]
これは ... 作用付きの合成の問題だ
Saturday, 30 January 16
![Page 51: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/51.jpg)
def f[M: Monad]: A => M[B]
def g[M: Monad]: B => M[C]
def h[M: Monad]: C => M[D]
.. a problem of composition with effects that can be generalized ..
これはモナドとして抽象化できる作用付きの合成の問題だ
Saturday, 30 January 16
![Page 52: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/52.jpg)
case class Kleisli[M[_], A, B](run: A => M[B]) {
def andThen[C](f: B => M[C])
(implicit M: Monad[M]): Kleisli[M, A, C] =
Kleisli((a: A) => M.flatMap(run(a))(f))}
.. function composition with Effects ..
It’s a Kleisli !
作用付きの関数の合成と言えば、Kleisli!
Saturday, 30 January 16
![Page 53: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/53.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[List, Order, Execution]
def allocate(acts: List[Account]): Kleisli[List, Execution, Trade]
Follow the types
.. function composition with Effects ..
def clientOrders: ClientOrderSheet => List[Order]
def execute(m: Market, broker: Account): Order => List[Execution]
def allocate(accounts: List[Account]): Execution => List[Trade]
型に任せて考える
Saturday, 30 January 16
![Page 54: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/54.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[List, Order, Execution]
def allocate(acts: List[Account]): Kleisli[List, Execution, Trade]
Domain algebra composed with the categorical algebra of a Kleisli Arrow
.. function composition with Effects ..
Klieisli 射によって合成されたドメイン代数
Saturday, 30 January 16
![Page 55: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/55.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[List, Order, Execution]
def allocate(acts: List[Account]): Kleisli[List, Execution, Trade]
.. that implements the semantics of our domain algebraically ..
.. function composition with Effects ..
ドメインの意味論を代数的に実装する作用付きの関数の合成
Saturday, 30 January 16
![Page 56: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/56.jpg)
def tradeGeneration( market: Market, broker: Account, clientAccounts: List[Account]) = {
clientOrders andThen execute(market, broker) andThen allocate(clientAccounts)
}
Implementation follows the specification
.. the complete trade generation logic ..
実装は仕様に従う
Saturday, 30 January 16
![Page 57: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/57.jpg)
def tradeGeneration( market: Market, broker: Account, clientAccounts: List[Account]) = {
clientOrders andThen execute(market, broker) andThen allocate(clientAccounts)
} Implementation follows the specification and we get the Ubiquitous Language for
free :-)
.. the complete trade generation logic ..
実装は仕様に従い、そこからユビキタス言語を読み取ることが出来るSaturday, 30 January 16
![Page 58: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/58.jpg)
algebraic & functional
• Just Pure Functions. Lower cognitive load - don’t have to think of the classes & data members where behaviors will reside
• Compositional. Algebras compose - we defined the algebras of our domain APIs in terms of existing, time tested algebras of Kleislis and Monads
代数的かつ関数型の設計は、純粋関数のみで構成する、合成可能な設計Saturday, 30 January 16
![Page 59: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/59.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[List, Order, Execution]
def allocate(acts: List[Account]): Kleisli[List, Execution, Trade]
.. our algebra still doesn’t handle errors that may occur within our domain
behaviors ..
.. function composition with Effects ..
そう言えばエラー処理どうする?
Saturday, 30 January 16
![Page 60: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/60.jpg)
more algebra, more types
代数と型、大盛りで追加!
Saturday, 30 January 16
![Page 61: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/61.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
return type constructor
List は戻り値の型コンストラクタ
Saturday, 30 January 16
![Page 62: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/62.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
return type constructor
What happens in case the operation fails ?演算が失敗したらどうなる?
Saturday, 30 January 16
![Page 63: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/63.jpg)
Error handling as an Effect
• pure and functional
• with an explicit and published algebra
• stackable with existing effects
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
モナド作用としてのエラー処理純粋で関数型に。明示的な代数。既存の作用と積み上げ可能。Saturday, 30 January 16
![Page 64: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/64.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
.. stacking of effects ..
M[List[_]]
作用の積み上げ
Saturday, 30 January 16
![Page 65: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/65.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
.. stacking of effects ..
M[List[_]]: M is a Monad
List をエラー処理のためのモナド M で囲む
Saturday, 30 January 16
![Page 66: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/66.jpg)
type Response[A] = String \/ Option[A]
val count: Response[Int] = some(10).rightfor { maybeCount <- count} yield { for { c <- maybeCount // use c } yield c}
Monad Transformers
モナド変換子
Saturday, 30 January 16
![Page 67: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/67.jpg)
type Response[A] = String \/ Option[A]
val count: Response[Int] = some(10).rightfor { maybeCount <- count} yield { for { c <- maybeCount // use c } yield c} type Error[A] = String \/ A
type Response[A] = OptionT[Error, A]
val count: Response[Int] = 10.point[Response]for{ c <- count // use c : c is an Int here} yield (())
Monad Transformers
Saturday, 30 January 16
![Page 68: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/68.jpg)
type Response[A] = String \/ Option[A]
val count: Response[Int] = some(10).rightfor { maybeCount <- count} yield { for { c <- maybeCount // use c } yield c} type Error[A] = String \/ A
type Response[A] = OptionT[Error, A]
val count: Response[Int] = 10.point[Response]for{ c <- count // use c : c is an Int here} yield (())
Monad Transformers
richer algebra
代数として扱いやすいのは OptionT を使った方
Saturday, 30 January 16
![Page 69: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/69.jpg)
Monad Transformers
• collapses the stack and gives us a single monad to deal with
• order of stacking is important though
モナド変換子は積み上げたモナドを一つに潰すことができるただし積み上げる順番は大切Saturday, 30 January 16
![Page 70: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/70.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
.. stacking of effects ..
case class ListT[M[_], A] (run: M[List[A]]) { //..
ListT モナド変換子を使う
Saturday, 30 January 16
![Page 71: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/71.jpg)
これは代数にとって小さな一歩だが、ドメインモデルにとっては巨大な跳躍であるSaturday, 30 January 16
![Page 72: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/72.jpg)
type StringOr[A] = String \/ Atype Valid[A] = ListT[StringOr, A]
これは代数にとって小さな一歩だが、ドメインモデルにとっては巨大な跳躍であるSaturday, 30 January 16
![Page 73: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/73.jpg)
type StringOr[A] = String \/ Atype Valid[A] = ListT[StringOr, A]
def clientOrders: Kleisli[Valid, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[Valid, Order, Execution]
def allocate(acts: List[Account]): Kleisli[Valid, Execution, Trade]
これは代数にとって小さな一歩だが、ドメインモデルにとっては巨大な跳躍であるSaturday, 30 January 16
![Page 74: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/74.jpg)
type StringOr[A] = String \/ Atype Valid[A] = ListT[StringOr, A]
def clientOrders: Kleisli[Valid, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[Valid, Order, Execution]
def allocate(acts: List[Account]): Kleisli[Valid, Execution, Trade]
.. a small change in algebra, a huge step for our domain model ..
これは代数にとって小さな一歩だが、ドメインモデルにとっては巨大な跳躍であるSaturday, 30 January 16
![Page 75: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/75.jpg)
def execute(market: Market, brokerAccount: Account) =
kleisli[List, Order, Execution] { order =>
order.items.map { item => Execution(brokerAccount, market, ..) }
}
Saturday, 30 January 16
![Page 76: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/76.jpg)
private def makeExecution(brokerAccount: Account, item: LineItem, market: Market): String \/ Execution = //..
def execute(market: Market, brokerAccount: Account) =
kleisli[Valid, Order, Execution] { order =>
listT[StringOr](
order.items.map { item =>
makeExecution(brokerAccount, market, ..)
}.sequenceU
) }
Saturday, 30 January 16
![Page 77: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/77.jpg)
List(aggregates)
Algebra of types
型の代数集約のための ListSaturday, 30 January 16
![Page 78: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/78.jpg)
List(aggregates)
Disjunction(error accumulation)
Algebra of types
エラー蓄積のためのDisjunction
Saturday, 30 January 16
![Page 79: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/79.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Algebra of types
依存性注入のための Kleisli
Saturday, 30 January 16
![Page 80: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/80.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Future(reactive non-blocking computation)
Algebra of types
リアクティブでノンブロッキングな処理のための Future
Saturday, 30 January 16
![Page 81: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/81.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Future(reactive non-blocking computation)
Algebra of types
Monad
モナド
Saturday, 30 January 16
![Page 82: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/82.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Future(reactive non-blocking computation)
Algebra of types
Monad Monoid
モノイド
Saturday, 30 January 16
![Page 83: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/83.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Future(reactive non-blocking computation)
Algebra of types
Monad MonoidCompositional
合成可能
Saturday, 30 January 16
![Page 84: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/84.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Future(reactive non-blocking computation)
Algebra of types
Monad Monoid
Offers a suite of functional combinators
さまざまな関数型コンビネータを提供する
Saturday, 30 January 16
![Page 85: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/85.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Future(reactive non-blocking computation)
Algebra of types
Monad Monoid
Handles edge cases so your domain logic remains clean
ドメインロジックを綺麗保てるように、エッジケースはこっちで処理するSaturday, 30 January 16
![Page 86: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/86.jpg)
List(aggregates)
Disjunction(error accumulation)
Kleisli(dependency injection)
Future(reactive non-blocking computation)
Algebra of types
Monad Monoid
Implicitly encodes quite a bit of domain rules
暗黙的にかなり多くのドメインルールをエンコードする
Saturday, 30 January 16
![Page 87: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/87.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[List, Order, Execution]
def allocate(acts: List[Account]): Kleisli[List, Execution, Trade]
.. the algebra ..
代数的な考え方
Saturday, 30 January 16
![Page 88: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/88.jpg)
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[List, Order, Execution]
def allocate(acts: List[Account]): Kleisli[List, Execution, Trade]
.. the algebra ..
functions
関数
Saturday, 30 January 16
![Page 89: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/89.jpg)
.. the algebra ..
def clientOrders: Kleisli[List, ClientOrderSheet, Order]
def execute(m: Market, b: Account): Kleisli[List, Order, Execution]
def allocate(acts: List[Account]): Kleisli[List, Execution, Trade]
types
型
Saturday, 30 January 16
![Page 90: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/90.jpg)
.. the algebra ..
composition
def tradeGeneration(market: Market, broker: Account, clientAccounts: List[Account]) = {
clientOrders andThen execute(market, broker) andThen allocate(clientAccounts)}
合成
Saturday, 30 January 16
![Page 91: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/91.jpg)
.. the algebra ..
trait OrderLaw {
def sizeLaw: Seq[ClientOrder] => Seq[Order] => Boolean = { cos => orders => cos.size == orders.size }
def lineItemLaw: Seq[ClientOrder] => Seq[Order] => Boolean = { cos => orders => cos.map(instrumentsInClientOrder).sum == orders.map(_.items.size).sum }}
laws of the algebra (domain rules)
代数の法則
Saturday, 30 January 16
![Page 92: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/92.jpg)
Domain Rules as Algebraic Properties
• part of the abstraction
• equally important as the actual abstraction
• verifiable as properties
代数的プロパティとしてのドメインルールプロパティとして検証可能となるSaturday, 30 January 16
![Page 93: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/93.jpg)
.. domain rules verification ..
property("Check Client Order laws") =
forAll((cos: Set[ClientOrder]) => {
val orders = for { os <- clientOrders.run(cos.toList) } yield os
sizeLaw(cos.toSeq)(orders) == true
lineItemLaw(cos.toSeq)(orders) == true
})
property based testing FTW ..プロパティベーステスト最強
Saturday, 30 January 16
![Page 94: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/94.jpg)
https://www.manning.com/books/functional-and-reactive-domain-modeling
本書いてます
Saturday, 30 January 16
![Page 95: Functional and Algebraic Domain Modeling](https://reader030.vdocuments.net/reader030/viewer/2022020314/58729e511a28ab07208b52fb/html5/thumbnails/95.jpg)
Thank You!
Saturday, 30 January 16