Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
自己関手の圏における モノイド対象 in Scala
Search
Kazuhiro Ichikawa
March 19, 2022
Programming
650
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.8k
ValiantParsing
phenan
1
140
Intro to typeclass in Scala
phenan
10
2.6k
Scalalr
phenan
1
2.6k
Other Decks in Programming
See All in Programming
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.8k
残高管理から台帳サービスへの進化
artoy
0
180
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
490
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
190
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
150
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
480
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
140
パスワード再設定メールのURLについて知っておこう
uyuki234
0
120
Simple Storage Service(S3) is not simple
iwatsukayura
0
250
Java 27新機能 / Java 27 new features
kishida
2
220
Domain-Driven Transformation
hschwentner
2
2.3k
R8 の設定見直しでアプリサイズ削減
andpad
0
200
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
530
How to Ace a Technical Interview
jacobian
280
24k
How to make the Groovebox
asonas
2
2.5k
Automating Front-end Workflow
addyosmani
1369
210k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
400
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Done Done
chrislema
187
17k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
Technical Leadership for Architectural Decision Making
baasie
3
600
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
430
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
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] }