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.5k
Scalaで圏論チョット学ぶ
ravineport
October 26, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
WEBエンジニア向けAI活用入門
sutetotanuki
0
320
GCCのプラグインを作る / I Made a GCC Plugin
shouth
1
150
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
160
cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話
phigasui
3
2.3k
3rd party scriptでもReactを使いたい! Preact + Reactのハイブリッド開発
righttouch
PRO
1
470
Honoの来た道とこれから
yusukebe
19
3.1k
リリース8年目のサービスの1800個のERBファイルをViewComponentに移行した方法とその結果
katty0324
5
3.9k
讓數據說話:用 Python、Prometheus 和 Grafana 講故事
eddie
0
370
Realtime API 入門
riofujimon
0
130
Importmapを使ったJavaScriptの 読み込みとブラウザアドオンの影響
swamp09
4
1.3k
offers_20241022_imakiire.pdf
imakurusu
2
370
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
10
1.7k
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
693
190k
Writing Fast Ruby
sferik
626
61k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
4
380
Producing Creativity
orderedlist
PRO
341
39k
Intergalactic Javascript Robots from Outer Space
tanoku
268
27k
What's new in Ruby 2.0
geeforr
343
31k
Making Projects Easy
brettharned
115
5.9k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Rails Girls Zürich Keynote
gr2m
93
13k
Documentation Writing (for coders)
carmenintech
65
4.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
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… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる!