More Related Content
PDF
PDF
継承やめろマジやめろ。 なぜイケないのか 解説する PPTX
世界一わかりやすいClean Architecture PDF
PDF
PDF
PPT
PPTX
What's hot
PDF
PDF
Pythonはどうやってlen関数で長さを手にいれているの? ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える KEY
PDF
PDF
PDF
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト PDF
チームメイトのためにdocstringを書こう! pyconjp2019 PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」 PDF
PDF
PDF
あの日見たMVCを僕たちはまだ知らない for RoR PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版) PDF
Building the Game Server both API and Realtime via c# PDF
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話 PDF
PDF
PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する PDF
Similar to Haskell Day2012 - 参照透過性とは何だったのか
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜 PDF
PDF
KEY
PDF
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8 PDF
PDF
ODP
PDF
Freer Monads, More Extensible Effects PDF
Object-Funcational Analysis and design PDF
PDF
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール PDF
PDF
Object-Functional Analysis and Design and Programming温泉 PDF
PDF
“Adoption and Focus: Practical Linear Types for Imperative Programming”他の紹介@P... PDF
オブジェクト指向開発におけるObject-Functional Programming PDF
More from Kousuke Ruichi
PDF
PDF
PDF
PDF
KEY
Programming haskell chapter10 KEY
Programming Haskell Chapter8 Haskell Day2012 - 参照透過性とは何だったのか
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
このスライドの範囲
純粋関数型言語
Java
Haskell
Scala
C# OCaml
C++ F# Clean
SML#
D
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
関数と型
TypeA f TypeB
• f :: TypeA -> TypeB
• どう読める?
• fは、TypeAを引数にとってTypeBを返す関数
...まあ間違ってはないけど。
- 32.
関数と型
TypeA f TypeB
• f :: TypeA -> TypeB
• どう読める?
• fは、TypeBを返すために、引数TypeA以外の情
報を一切使わない関数
- 33.
型2
• g ::(Monad m) => TypeA -> m TypeB
• どう読む?
- 34.
- 35.
例えば状態系のモナド
• g ::(Monad m) => TypeA -> m TypeB
• イメージ図
Monad m
TypeA f m TypeB
Context
- 36.
例えば状態系のモナド
• g ::(Monad m) => TypeA -> m TypeB
• 引数はTypeA
引数 Monad m
TypeA f m TypeB
Context
- 37.
例えば状態系のモナド
• g ::(Monad m) => TypeA -> m TypeB
• コンテクスト/文脈は背後に存在するイメージ
コンテクスト
Monad m
(状態系)
TypeA f m TypeB
Context
- 38.
例えば状態系のモナド
• g ::(Monad m) => TypeA -> m TypeB
• 返り値は文脈情報付きで表される
返り値
Monad m (文脈情報付き)
TypeA f m TypeB
Context
- 39.
例えば状態系のモナド
• g ::(Monad m) => TypeA -> m TypeB
• コンテクストに状態が保持されている
Monad m
TypeA f m TypeB
モナドが保持
する状態 Context
- 40.
例えば状態系のモナド
• g ::(Monad m) => TypeA -> m TypeB
• コンテクストの状態と相互作用出来る
• 相互作用のための関数が大抵存在
Monad m
TypeA f m TypeB
状態との
相互作用
Context
- 41.
例えば状態系のモナド
• g ::(Monad m) => TypeA -> m TypeB
• モナド(状態系)はそんな感じのイメージ
Monad m
TypeA f m TypeB
Context
- 42.
- 43.
Readerモナド
• Readerモナド
• ReadOnlyの値をコンテクストに持つ
• f :: (MonadReader m) => TypeA -> m TypeB
MonadReader m
TypeA f m TypeB
ReadOnly!!
Config情報
Config
- 44.
Writerモナド
• Writerモナド
• WriteOnlyの値をコンテクストに持つ
• f :: (MonadWriter m) => TypeA -> m TypeB
MonadWriter m
TypeA f m TypeB
WriteOnly!!
Log情報
Log
- 45.
Stateモナド
• Stateモナド
• 書き換え可能な値をコンテクストに持つ
• f :: (MonadState m) => TypeA -> m TypeB
MonadState m
TypeA f m TypeB
Read / Write
所謂「状態」 可能
State
- 46.
IOモナド
• IOモナド
• 外界とやりとり出来るぜー
• f :: TypeA -> IO TypeB
IO
TypeA f IO TypeB
副作用!
外部の世界!
World
- 47.
モナド変換子
• モナドとモナド変換子からモナドを作る
• コンテクスト同士を組み合わせる
TypeA f m TypeB
State
StateT モナド変換子
Config
ReaderT モナド変換子
World
IO モナド
- 48.
モナド変換子
• モナドとモナド変換子からモナドを作る
• 組み合わせた結果もモナドになる
TypeA f m TypeB
State 組み合わせた
StateT 結果もモナド
Config
ReaderT
World
IO
- 49.
モナド変換子
• モナドとモナド変換子からモナドを作る
• それぞれの文脈と相互作用出来る
TypeA f m TypeB
それぞれの文脈と
State 相互作用可能
StateT
Config
ReaderT
World
IO
- 50.
設計観点から見たモナド
• モナドとはコンテクストの部品
• 既存のコンテクストを組み合わせて目的に適した
コンテクストを作る
TypeA f m TypeB
State
StateT
Config
ReaderT
World
IO
- 51.
- 52.
もう一度、型2
• g ::(Monad m) => TypeA -> m TypeB
• どう読む?
• 引数TypeAに加え、コンテクストmと相互作用をする
Monad m
TypeA g m TypeB
Context
- 53.
もう一度、型2
• g ::(Monad m) => TypeA -> m TypeB
• どう読む?
• gの返り値であるコンテクストm上の計算結果
TypeBは、
• 引数TypeAとコンテクストmから取得できる情報
以外の情報を一切使わない
- 54.
つまり?
• 情報の依存関係が明確に現れる
TypeA f TypeB
※fの結果 TypeBはTypeAにのみ依存する
TypeA g m TypeB
Context
※ gの結果TypeBはTypeAとコンテクストmに依存する
- 55.
- 56.
- 57.
- 58.
- 59.
設計とは何か
• アーキテクチャ
•責務ごとに分割
• レイヤー
• 下位レイヤーに依存、上位レイヤーと疎
• モジュール
• オブジェクトを責務ごとに分類
• オブジェクト
• 扱う情報、責務ごとに分割
- 60.
参照出来る情報の制限
• f :: TypeA -> TypeB
参照情報は
引数のみ TypeA f TypeB
• g :: (Monad m) => TypeA -> m TypeB
TypeA g m TypeB
参照情報1 Context 参照情報2
- 61.
影響を与える範囲の制限
外部への影響は
• f :: TypeA -> TypeB
一切無い!
TypeA f TypeB
• g :: (Monad m) => TypeA -> m TypeB
TypeA g m TypeB
Context 影響を与える範囲
はここだけ!
- 62.
副作用の明示
• h ::TypeA -> IO TypeB
TypeA g IO TypeB
World 外界とのやり取りは
副作用!
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
高いパフォーマンス
• 先人の蓄積
•STモナド
• 参照透明で安全な破壊的代入
• Vector
• Deforestation/recycling
• BlazeBuilder
• 差分リスト
• Repa
• IntMap
- 76.
- 77.
- 78.
- 79.
- 80.
型でなんとかする
• j ::Int -> TypeD
• Int指定しているが、実際にはその部分集合で十分
• 型は値の集合
• 使わない値はバグの元
• data OneToThree = One | Two | Three
• Intで使わない部分を排除する
➡ コンパイルがテストになる!
- 81.
型でなんとかする
• デメリット
•コストが高い
• 適用範囲が少ない
• 1000個の場合はどうするの?
• えーとTemplate Haskellで...
• あまり実用的ではないか...
• 依存型、軽い構文が望まれるか...
- 82.
値のテスト
• 純粋関数
• 参照情報は引数のみ
• 外部への影響は一切無い
➡ 引数に対する返り値のみチェックすればいい
外部への影響は
一切無い!
参照情報は
引数のみ TypeA f TypeB
- 83.
値のテスト
• 純粋関数
•QuickCheck
• 型からテストケースを自動生成する
• 参照透過性を持つ言語で力を最大限発揮
• SmallCheck
• 値の範囲を制限して総当たりテスト(確か)
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.