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
functionalなアプローチで動的要素を排除する
ryopeko
1
210
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
180
非ブラウザランタイムとWeb標準 / Non-Browser Runtimes and Web Standards
petamoriken
0
430
GitHub CopilotでTypeScriptの コード生成するワザップ
starfish719
26
6k
毎日13時間もかかるバッチ処理をたった3日で60%短縮するためにやったこと
sho_ssk_
1
550
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
630
Fibonacci Function Gallery - Part 2
philipschwarz
PRO
0
210
php-conference-japan-2024
tasuku43
0
430
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
870
return文におけるstd::moveについて
onihusube
1
1.4k
カンファレンス動画鑑賞会のススメ / Osaka.swift #1
hironytic
0
170
AppRouterを用いた大規模サービス開発におけるディレクトリ構成の変遷と問題点
eiganken
1
450
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
Code Review Best Practice
trishagee
65
17k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Being A Developer After 40
akosma
89
590k
Become a Pro
speakerdeck
PRO
26
5.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
173
51k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Producing Creativity
orderedlist
PRO
343
39k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
360
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… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる!