$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自己関手の圏における モノイド対象 in Scala
Search
Kazuhiro Ichikawa
March 19, 2022
Programming
0
600
自己関手の圏における モノイド対象 in Scala
Kazuhiro Ichikawa
March 19, 2022
Tweet
Share
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
110
Intro to typeclass in Scala
phenan
10
2.5k
Scalalr
phenan
1
2.5k
Other Decks in Programming
See All in Programming
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
180
開発に寄りそう自動テストの実現
goyoki
2
1.3k
愛される翻訳の秘訣
kishikawakatsumi
3
340
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
3.2k
Go コードベースの構成と AI コンテキスト定義
andpad
0
130
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
150
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
130
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
170
AIエージェントの設計で注意するべきポイント6選
har1101
5
1.8k
ローカルLLMを⽤いてコード補完を⾏う VSCode拡張機能を作ってみた
nearme_tech
PRO
0
130
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
560
ローターアクトEクラブ アメリカンナイト:川端 柚菜 氏(Japan O.K. ローターアクトEクラブ 会長):2720 Japan O.K. ロータリーEクラブ2025年12月1日卓話
2720japanoke
0
740
Featured
See All Featured
Marketing to machines
jonoalderson
1
4.3k
Between Models and Reality
mayunak
0
150
The Limits of Empathy - UXLibs8
cassininazir
1
190
Mobile First: as difficult as doing things right
swwweet
225
10k
Getting science done with accelerated Python computing platforms
jacobtomlinson
0
76
A Tale of Four Properties
chriscoyier
162
23k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
510
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
400
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
2
61
Navigating Team Friction
lara
191
16k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
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] }