4DBMBͰݍŧŔŕŪֶͿ4DBMBؔ4VNNJU'SJOHFגࣜձࣾ ୩ޱ ܚҰ1
View Slide
ࣗݾհ୩ޱ ܚҰFringe81גࣜձࣾ新卒2年⽬ サーバサイドエンジニア・広告プロダクトでScala書いてます・数学をやっていた⼈ではありません・Haskellもわかりません⼈⽣初登壇!2twitter: @ravineport
ݍΛֶͿϞνϕʔγϣϯ3• Scalaに慣れてきたので、関数型ライブラリ(Scalaz, Cats)を触ってみる ???よくわかんないけど⼀旦使うことはできるっぽいからいいか・・・(とはいえ⼼にモヤモヤは残る)圏論っていうのから来てるらしいぞ
ݍΛֶͿϞνϕʔγϣϯ4関数型ライブラリ・Scalaz・Catsetc…圏論・圏・関⼿・⾃然変換etc…確かに使っている使うよくわからない世界でも⾒え隠れしている圏論学んでみよう!
ݍɺ৺ંΕ͕ͪ• ΠϯλʔωοτͰௐΔʢ͍͠ʣ5• 本で学ぶ(やっぱり難しい)⼼が折れそうになりながらもなんとなく圏論の雰囲気は掴むことができた気がするので、ここまでの学びを共有したいと思います
ࠓͷΰʔϧ6関数型プログラミングのライブラリ・Scalaz・Catsetc…圏論・圏・関⼿・⾃然変換etc…概念を使っている使う⾒え隠れしても怖くない!チョットわかる!※ エンジニアのよく⾔う「完全に理解した」→ 「全然わからん」 →「チョットわかる」の「チョットわかる」ではなく⽂字通りの「チョットわかる」がゴールです
ࠓͷΰʔϧʢ͏গ͠۩ମྫʹʣ• ݍͰͷϞφυͷงғؾ͕Θ্͔ͬͨͰɺϓϩάϥϛϯάͰͲ͏׆͔͞Ε͍ͯΔͷ͔ΛͳΜͱͳ͘ײ͡Δ• ݁ՌɺݍͷงғؾΘ͔Δ• ݍ• ؔख• ࣗવม• ͳΜͱͳ͘Θ͔Δ͕ΰʔϧͳͷͰɺͦ͜·Ͱਖ਼֬ͳ͠ͳ͍ʢͰ͖ͳ͍ʣ7
༐ؾΛग़ͯ͠ͱΓ͋͑ͣϞφυͷఆٛΛݟͯΈΔ8Wikipediaより
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ9• 各種記号• 圏• 関⼿• ⾃然変換
ݍͷجຊͱͳΔେͳ֓೦• ݍʢDBUFHPSZʣ• ؔखʢGVODUPSʣ• ࣗવมʢOBUVSBMUSBOTGPSNBUJPOʣ10参考⽂献:・圏論の道案内〜⽮印でえがく数学の世界〜・Category Theory for Programmers・もう諦めない圏論⼊⾨
ݍʢDBUFHPSZʣ11対象(object)と射(arrow, morphism)からなるある種のシステム圏の概念のイメージ図対象Aから対象Bへの射f:圏を構成するためには満たすべきいくつかの規則があるfの域 dom(f) = Afの余域 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オフィス恒等射 = 移動しないという移動の仕⽅
ݍͷఆٛ·ͱΊ• ʮରʯͱʮࣹʯ• ʮҬʯʮ༨Ҭʯ͕ఆΊΒΕΔ• ʮ߹ʯ͕ఆΊΒΕΔ15fの域 dom(f) = Afの余域 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*(()圏 圏Ddom = cod()圏D ∘ = () ∘ ()
圏 DؔखʢGVODUPSʣ21圏 から への関⼿ とは, の任意の対象と射に対して、 の対象と射をそれぞれただ⼀つ定める対応付けまた、以下を満たすとなる任意の射 に対して圏 の任意の対象 について圏 1(= 1*(()圏 圏Ddom = 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 なんかややこしい
Ϟφυͷ׆༂38Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないからA.モナド () は関⼿なので、 を考えることができてさらにモナドの性質 からでも
͍ͧ͢͝Ϟφυʂͦͷ39Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないからA.モナド () は関⼿なので、 を考えることができてさらにモナドの性質 からでもこの拡張をモナドがやってくれる!
͍ͧ͢͝Ϟφυʂͦͷ40Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないからA.モナド () は関⼿なので、 を考えることができてさらにモナドの性質 からでもこの拡張をモナドがやってくれる!Some(b)かつ が成功したときにのみ型Cの値が返る⾃然変換 が「すべて成功した場合」と「1つでも失敗した場合」にまとめてくれる!
4DBMBͰϞφυΛݟͯΈΔ41scala-hamsters/hamsters のMonad.scala
4DBMBͰϞφυΛݟͯΈΔ42scala-hamsters/hamsters のMonad.scala⾃然変換
4DBMBͰϞφυΛݟͯΈΔ43scala-hamsters/hamsters のMonad.scala⾃然変換f: A => Box[B]を渡せば、Box[A] => Box[B]という関数を にしてくれる感があるを に潰してもいるflatMap!
·ͱΊ• ݍͷجຊతͳ֓೦Λͳ͕Ίͨ• ݍ• ؔख• ࣗવม• Ϟφυͱͳʹ͔ɺͳΜͷʹཱͭͷ͔• ܭࢉޮՌΛ͍͍ײ͡ʹѻ͑Δʂ44関数型プログラミングのライブラリ・Scalaz・Catsetc…圏論・圏・関⼿・⾃然変換etc…概念を使っている使う⾒え隠れしても怖くない!チョットわかる!