Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Scalaで圏論チョット学ぶ
Search
ravineport
October 26, 2019
Programming
6
4.6k
Scalaで圏論チョット学ぶ
ravineport
October 26, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
CloudNativePGを布教したい
nnaka2992
0
120
Boos Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
620
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
9
2.6k
たのしいSocketのしくみ / Socket Under a Microscope
coe401_
8
1.4k
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
260
もう僕は OpenAPI を書きたくない
sgash708
6
1.9k
AIレビュー導入によるCIツールとの共存と最適化
kamo26sima
1
640
Ça bouge du côté des animations CSS !
goetter
2
160
DRFを少しずつ オニオンアーキテクチャに寄せていく DjangoCongress JP 2025
nealle
2
290
やっと腹落ち「スプリント毎に動くモノをリリースする」〜ゼロから始めるメガバンクグループのアジャイル実践〜
sasakendayo
0
150
[JAWS DAYS 2025] 最近の DB の競合解決の仕組みが分かった気になってみた
maroon1st
0
170
PRレビューのお供にDanger
stoticdev
1
240
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
67
11k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Designing for humans not robots
tammielis
250
25k
GraphQLの誤解/rethinking-graphql
sonatard
69
10k
Agile that works and the tools we love
rasmusluckow
328
21k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Designing for Performance
lara
605
68k
Documentation Writing (for coders)
carmenintech
68
4.6k
It's Worth the Effort
3n
184
28k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Transcript
4DBMBͰݍŧŔŕŪֶͿ 4DBMBؔ4VNNJU 'SJOHFגࣜձࣾ ୩ޱ ܚҰ 1
ࣗݾհ ୩ޱ ܚҰ Fringe81גࣜձࣾ 新卒2年⽬ サーバサイドエンジニア ・広告プロダクトでScala書いてます ・数学をやっていた⼈ではありません ・Haskellもわかりません ⼈⽣初登壇!
2 twitter: @ravineport
ݍΛֶͿϞνϕʔγϣϯ 3 • Scalaに慣れてきたので、関数型ライブラリ(Scalaz, Cats)を触ってみる ??? よくわかんないけど⼀旦使うことはできるっぽいからいいか・・・ (とはいえ⼼にモヤモヤは残る) 圏論っていうのから来てるらしいぞ
ݍΛֶͿϞνϕʔγϣϯ 4 関数型ライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿ ・⾃然変換
etc… 確かに 使っている 使う よくわからない世界 でも⾒え隠れしている 圏論学んでみよう!
ݍɺ৺ંΕ͕ͪ • ΠϯλʔωοτͰௐΔʢ͍͠ʣ 5 • 本で学ぶ(やっぱり難しい) ⼼が折れそうになりながらも なんとなく圏論の雰囲気は掴むことができた気がする ので、ここまでの学びを共有したいと思います
ࠓͷΰʔϧ 6 関数型プログラミング のライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿
・⾃然変換 etc… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる! ※ エンジニアのよく⾔う 「完全に理解した」→ 「全然わからん」 →「チョットわかる」の「チョットわかる」ではなく ⽂字通りの「チョットわかる」がゴールです
ࠓͷΰʔϧʢ͏গ͠۩ମྫʹʣ • ݍͰͷϞφυͷงғؾ͕Θ্͔ͬͨͰɺ ϓϩάϥϛϯάͰͲ͏׆͔͞Ε͍ͯΔͷ͔ΛͳΜͱͳ͘ײ͡Δ • ݁ՌɺݍͷงғؾΘ͔Δ • ݍ • ؔख
• ࣗવม • ͳΜͱͳ͘Θ͔Δ͕ΰʔϧͳͷͰɺͦ͜·Ͱਖ਼֬ͳ͠ͳ͍ʢͰ͖ͳ͍ʣ 7
༐ؾΛग़ͯ͠ͱΓ͋͑ͣϞφυͷఆٛΛݟͯΈΔ 8 Wikipediaより
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 9 • 各種記号 • 圏 • 関⼿ • ⾃然変換
ݍͷجຊͱͳΔେͳ֓೦ • ݍʢDBUFHPSZʣ • ؔखʢGVODUPSʣ • ࣗવมʢOBUVSBMUSBOTGPSNBUJPOʣ 10 参考⽂献: ・圏論の道案内〜⽮印でえがく数学の世界〜
・Category Theory for Programmers ・もう諦めない圏論⼊⾨
ݍʢDBUFHPSZʣ 11 対象(object)と射(arrow, morphism)からなるある種のシステム 圏の概念のイメージ図 対象Aから対象Bへの射f: 圏を構成するためには 満たすべきいくつかの規則がある fの域 dom(f)
= A fの余域 cod(f) = B
ݍΛߏ͢ΔͨΊͷنଇ̍ɿ߹ 12 対象:オフィス、居酒屋、家 射:移動の仕⽅ オフィス 居酒屋 家 f g 「オフィスから居酒屋への射f」と「居酒屋から家への射g」から
「オフィスから家への射」 が得られる 対象:⼈ 射:友⼈関係 Aさん Bさん Cさん f g 定義できない
ݍΛߏ͢ΔͨΊͷنଇ̎ɿ݁߹ 13 のような任意のf, g, hについて が成り⽴つこと 図で表すと 合成する順番を⼊れ替えても結果は同じ 「域と余域がそれぞれ等しい射は互いに等しい」 が成り⽴っている図
↑可換図式という
ݍΛߏ͢ΔͨΊͷنଇ̏ɿ߃ࣹ 14 どんな対象Aに対して、恒等射(identity)と呼ばれる特別な射1A がただ1つ存在し、 余域をAとする任意の射f、域をAとする任意の射gに対して 1A ◦f = f および
g◦1A = gが成り⽴つ。 ⾔い換えると が可換(単位律という) オフィス 居酒屋 家 f g 恒等射 = 何もしない射 1居酒屋 1家 1オフィス 恒等射 = 移動しないという移動の仕⽅
ݍͷఆٛ·ͱΊ • ʮରʯͱʮࣹʯ • ʮҬʯʮ༨Ҭʯ͕ఆΊΒΕΔ • ʮ߹ʯ͕ఆΊΒΕΔ 15 fの域 dom(f)
= A fの余域 cod(f) = B • 「結合律」が成り⽴つ • 「単位律」が成り⽴つ
4DBMBͷੈքͩͱ • ରɿܕ • ࣹɿؔ 16 イメージ図 もう少し簡潔にすると https://qiita.com/norkron/items/f90d851daf05a2efa567
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 17 • 各種記号 • 圏 • 関⼿ • ⾃然変換
ݍͷ࣍ɾɾɾ 18 圏の間の関係性、対応付けを考えることができそう 圏 圏D ? 圏Cの対象aは、圏Dの対象aʼに対応付けできて 圏Cの射fは、圏Dの射fʼに対応付けできて・・・みたいな
ݍ ͱݍ ͷରԠ͚ 19 D • 圏には合成という構造があるので、それを保つ対応付けをしたい • 対象と射の関係を保ちたい これが関⼿
圏 D ؔखʢGVODUPSʣ 20 圏 から への関⼿ とは , の任意の対象と射に対して、
の対象と射をそれぞれただ⼀つ定める対応付け また、以下を満たす となる任意の射 に対して 圏 の任意の対象 について 圏 1( = 1*(() 圏 圏D dom = cod() 圏D ∘ = () ∘ ()
圏 D ؔखʢGVODUPSʣ 21 圏 から への関⼿ とは , の任意の対象と射に対して、
の対象と射をそれぞれただ⼀つ定める対応付け また、以下を満たす となる任意の射 に対して 圏 の任意の対象 について 圏 1( = 1*(() 圏 圏D dom = cod() 圏D ∘ = () ∘ () 先に合成してから移す = 移してから合成する 対象aの恒等射を移すと 対象a (圏C)を移した 対象aʼ (圏D)の恒等射と同じ
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 22 • 各種記号 • 圏 • 関⼿ • ⾃然変換
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 23 • 各種記号 • 圏 • 関⼿ • ⾃然変換
⾃分⾃⾝への関⼿ :⾃⼰関⼿
ݍ ͔Βݍ ʹෳͷؔख͕͋Δ߹ 24 D と の関係を考えられそう 圏 圏 それが⾃然変換の考え
ࣗવม 25 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射
を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
ࣗવม 26 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射
を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
ࣗવม 27 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射
を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 28 • 各種記号 • 圏 • 関⼿ • ⾃然変換
雰囲気を理解する下地は整った・・・!
վΊͯϞφυͷఆٛ 29 圏 のモナドは 関⼿ ∘ = ∘ ∘ =
∘ = A ⾃然変換 ⾃然変換 ( は圏 の恒等関⼿) から成り 以下の条件を満たす 結合律: 単位律:
݁߹ͱ୯ҐΛల։ͯ͠ΈΔ 30 圏 のモナドは 関⼿ ∘ = ∘ ∘ =
∘ = A ⾃然変換 ⾃然変換 以下の条件を満たす 結合律: 単位律: ( は圏 の恒等関⼿) から成り
݁߹ 31 関⼿ ∘ = ∘ ⾃然変換 ⾃然変換 後ろ2つを潰す 前2つを潰す
潰す順番に依らない
Ϟφυͷఆٛ 32 圏 のモナドは 関⼿ ∘ = ∘ ∘ =
∘ = A ⾃然変換 ⾃然変換 ( は圏 の恒等関⼿) から成り 以下の条件を満たす 結合律: 単位律:
ϞφυͬͯϓϩάϥϛϯάͰͳΜͷʹཱͭͷʁ 33 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する •
引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する
ϞφυͬͯϓϩάϥϛϯάͰͳΜͷʹཱͭͷʁ 34 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する •
引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する 「値」から「値」への計算に集中したいけど、実際は 「失敗かもしれない値」から「失敗かもしれない値」へのプログラムにしないといけない
ϞφυͬͯϓϩάϥϛϯάͰͳΜͷʹཱͭͷʁ 35 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する •
引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する 「値」から「値」への計算に集中したいけど、実際は 「失敗かもしれない値」から「失敗かもしれない値」へのプログラムにしないといけない Moggi教授 「いくつかの計算効果はモナドとして捉えられる」
ࣦഊ͢Δ͔͠Εͳ͍ϓϩάϥϜΛѻ͏ 36 この計算効果に対応するのがMaybe モナド Maybe モナド: プログラム :型Aを受け取って、成功したら型Bを返す ← 関⼿
(ScalaならOption型) 射 型Aの値a、型Bの値bとして aを受け取って成功すれば f(a) = Some(a)、失敗すればf(a) = None プログラム :射
ࣦഊ͢Δ͔͠Εͳ͍ϓϩάϥϜΛѻ͏ 37 この計算効果に対応するのがMaybe モナド Maybe モナド: プログラム :型Aを受け取って、成功したら型Bを返す ← 関⼿
(ScalaならOption型) 射 型Aの値a、型Bの値bとして aを受け取って成功すれば f(a) = Some(a)、失敗すればf(a) = None プログラム :射 と を連結すると・・・ a None 失敗 成功 b None 失敗 成功 c なんかややこしい
Ϟφυͷ׆༂ 38 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、
を考えることができて さらにモナドの性質 から でも
͍ͧ͢͝Ϟφυʂͦͷ 39 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、
を考えることができて さらにモナドの性質 から でも この拡張をモナドがやってくれる!
͍ͧ͢͝Ϟφυʂͦͷ 40 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、
を考えることができて さらにモナドの性質 から でも この拡張をモナドがやってくれる! Some(b)かつ が成功したときにのみ型Cの値が返る ⾃然変換 が「すべて成功した場合」と「1つでも失敗した場合」にまとめてくれる!
4DBMBͰϞφυΛݟͯΈΔ 41 scala-hamsters/hamsters のMonad.scala
4DBMBͰϞφυΛݟͯΈΔ 42 scala-hamsters/hamsters のMonad.scala ⾃然変換
4DBMBͰϞφυΛݟͯΈΔ 43 scala-hamsters/hamsters のMonad.scala ⾃然変換 f: A => Box[B]を渡せば、Box[A] =>
Box[B]という関数 を にしてくれる感がある を に潰してもいる flatMap!
·ͱΊ • ݍͷجຊతͳ֓೦Λͳ͕Ίͨ • ݍ • ؔख • ࣗવม •
Ϟφυͱͳʹ͔ɺͳΜͷʹཱͭͷ͔ • ܭࢉޮՌΛ͍͍ײ͡ʹѻ͑Δʂ 44 関数型プログラミング のライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿ ・⾃然変換 etc… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる!