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
自己関手の圏における モノイド対象 in Scala
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kazuhiro Ichikawa
March 19, 2022
Programming
640
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自己関手の圏における モノイド対象 in Scala
Kazuhiro Ichikawa
March 19, 2022
More Decks by Kazuhiro Ichikawa
See All by Kazuhiro Ichikawa
Tuples and Mirrors in Scala3 and Higher-Kinded Data
phenan
0
1.7k
ValiantParsing
phenan
1
130
Intro to typeclass in Scala
phenan
10
2.6k
Scalalr
phenan
1
2.5k
Other Decks in Programming
See All in Programming
1B+ /day規模のログを管理する技術
broadleaf
0
120
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
440
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.3k
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.6k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
820
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
110
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
8
920
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
680
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
160
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
130
継続モナドとリアクティブプログラミング
yukikurage
2
230
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
230
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
340
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
How to build a perfect <img>
jonoalderson
1
5.8k
Google's AI Overviews - The New Search
badams
0
1.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Transcript
⾃⼰関⼿の圏における モノイド対象 in Scala @phenan
おことわり ´ 圏論的に厳密な話はしません ´ 雰囲気だけ分かった気持ちになるところが⽬標
モナドは単なる⾃⼰関⼿の圏における モノイド対象だよ。何か問題でも︖ Philip Lee Wadler
有名な煽り⽂句 ´ モナドを勉強しようとした⼈の意思を粉砕する ´ 雰囲気だけでも理解しておきたい︕
分解: ⾃⼰関⼿の圏におけるモノイド対象 ´ 圏 ´ 関⼿ ´ ⾃⼰関⼿ ´ ⾃⼰関⼿の圏
´ モノイド対象
圏 (category) ´ 数学的対象とそれらの間の関係(射)の集まり ´ 射は合成可能 ´ 抽象的すぎていまいちピンとこない
型を対象とし、関数の型の関係を考える ´ 右図だと Byte, Int, String が対象 ´ Byte =>
Int, Int => String, Byte => String が射 ´ 射の合成可能性 = 関数の合成可能性 Int String Byte
全部 Option 型にしてみる ´ これも圏 ´ 対象: Option[Byte], Option[Int], Option[String]
´ 射: Option[Byte] => Option[Int], (略) Option[Int] Option[String] Option[Byte]
⾼階型 F[_] の表現する圏 ´ 対象: 任意の型 T に対する F[T] ´
射: 任意の型 T1, T2 に対して F[T1] => F[T2] ´ だいたいこいつを考えておけばOK
Hask圏 ´ 対象: 任意の型 ´ 射: 任意の型 T1, T2 に対して
T1 => T2 ´ ⾼階型 F[_] の表現する圏の F が Id のバージョンとも考えられる
関⼿ ´ 圏から圏への対応付け ´ 射の合成を保存する
具体例 ´ Option をつけたものに対応させる Int String Byte Option[Int] Option[String] Option[Byte]
我々はこれを知っている ´ Int => String が Option[Int] => Option[String] に対応する
´ Option.map: (A => B) => Option[A] => Option[B] Int String Byte Option[Int] Option[String] Option[Byte]
Cats, Scalaz の Functor ´ 射 A => B を
射 F[A] => F[B] に対応させる ´ Hask圏から⾼階型F[_]の表現する圏への関⼿ trait Functor[F[_]] { def map[A, B](f: A => B): F[A] => F[B] }
⾃⼰関⼿ ´ 関⼿のうち、圏をその圏⾃⾝の⼀部分に対応させるもの ´ フラクタル的なイメージ︖
Cats, Scalaz の Functor は⾃⼰関⼿ ´ 射 F[A] => F[B]
は⾃明にHask圏の射でもある trait Functor[F[_]] { def map[A, B](f: A => B): F[A] => F[B] }
関⼿の圏 ´ 関⼿は圏を別の圏に移す ´ 関⼿同⼠も合成可能 ´ 関⼿を射とみなして圏を作れる B C A
関⼿ F: A => B 関⼿G∘F: A => C 関⼿G: B => C
具体例 ´ Option と Future の合成 ´ Option.map: (A =>
B) => Option[A] => Option[B] ´ Future.map: (A => B) => Future[A] => Future[B] Id Option.map Future.map Future[Option[_]] Option[_]
⾃⼰関⼿の圏 ´ ⾃⼰関⼿同⼠は合成しても⾃⼰関⼿ ´ ⾃⼰関⼿同⼠を合成する演算 ⊗ を考えると、結果も⾃⼰関⼿になる ´ モノイドっぽい︕==> モノイド圏と呼ばれる
´ モノイドの要件として単位元が必要
具体例 ´ G[_] ⊗ F[_] -> G[F[_]] になる ´ 単位元:
Id Id Option.map Future.map Future[Option[_]] def compose[A, B](f: A => B): G[F[A]] => G[F[B]] = { Functor[G].map(Functor[F].map(f)) } Option[_]
モノイド対象 ´ モノイド圏の対象Mのうち以下の条件を満たすもの ´ M ⊗ M が M に戻る
´ 単位元 を I として I => M の射が存在する ´ イメージとしては、それ⾃⾝がモノイドであるような対象 ´ ⊗ がそれ⾃⾝の⼆項演算になる ´ それ⾃⾝の単位元をモノイド圏全体の単位元から導ける
OptionはFunctorの圏のモノイド対象 ´ Option[_] ⊗ Option[_] = Option[Option[_]] ´ flatten すれば
Option[_] に戻せる︕ ´ 単位元 Id から Option への射: T => Option[T] ´ これは Some(_) のこと
Functorの圏のモノイド対象 ´ flatten: F[F[A]] => F[A] と unit: A =>
F[A] があれば良い ´ つまりこうなる trait Monad[F[_]] extends Functor[F[_]] { def flatten[A](f: F[F[A]]): F[A] def unit[A](f: A): F[A] }