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
ファンクタからモナド / Functor to Monad
Search
kii310
August 29, 2026
Programming
22
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ファンクタからモナド / Functor to Monad
kii310
August 29, 2026
More Decks by kii310
See All by kii310
カリー化と部分適用(更新) / currying_and_partial_application_in_TypeScript
kii310
0
120
ディスパッチについて
kii310
1
53
再帰関数は無名関数にできるか?
kii310
2
180
未来は現在からの継続
kii310
3
560
アーキテクチャの一番最初の話
kii310
1
72
カリー化と部分適用
kii310
3
130
抽象に依存する
kii310
1
140
抽象に依存する 〜概論編〜
kii310
2
130
純粋関数からDI
kii310
2
230
Other Decks in Programming
See All in Programming
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.2k
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
390
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
190
ALB ログから Trace を気合で繋げる技術
fohte
7
770
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
220
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
550
高専キャリア LT 発表内容
crysta1221
4
4.2k
Press start. Python's next generation.
willingc
PRO
3
250
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
160
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
440
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.9k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
First, design no harm
axbom
PRO
2
1.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Designing for Performance
lara
611
70k
How to train your dragon (web standard)
notwaldorf
97
6.8k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Crafting Experiences
bethany
1
270
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
710
Unsuck your backbone
ammeep
672
58k
How STYLIGHT went responsive
nonsquared
100
6.2k
Transcript
ファンクタからモナドへ kii
ファンクタとかモナドって 聞いたことありますか?
正直分からん、、、
雰囲気掴んだので共有します
雰囲気掴んだので共有します 間違ってたらごめんなさい
がっつり関数型プログラミングの話 ですが、 私が Haskell などを知らないので TypeScript で解説します
結論
ファンクタとは 文脈に包まれた値に対して 関数が文脈を気にせず 適用できるようにした 設計(デザインパターン)
モナドとは 文脈を発生させる関数を 文脈の中でも扱えるようにした 設計(デザインパターン)
動機
そもそもファンクタやらモナドは 概念として何故あるのか
文脈に包まれた値でも 普通の値と同じように 文脈を気にせず関数を扱いたいため
普通の値 1, “one”, true
文脈に包まれた値 配列、オブジェクト、関数など
普通の値であれば
では、文脈に包まれた値 例えばオブジェクトでは?
文脈(オブジェクト)から値を 取り出して、関数適用してまた文脈に
関数を実行した後も 文脈に包んで返したい
関数は文脈を知らない そのため文脈から値を切り出す
関数が文脈を気にせず使えるように したい これがファンクタの動機
ファンクタ
取り出し、関数適用、文脈に包む 一連の処理を担う関数を用意しよう
mapCtx に処理をまとめている 引数 f に inc や double などの 具体的な関数が入る
文脈の値を数値に限定していたので、 ジェネリクスで任意の型にする
None
普通の値との比較
Ctx という文脈は map によって 文脈を気にせずに関数を 適用することができるようになった このような関数に対する デザインパターンをファンクタと呼ぶ 厳密にはファンクタ則を満たしている必要がある
Ctx という文脈は map によって 文脈を気にせずに関数を 適用することができるようになった このような関数に対する デザインパターンをファンクタと呼ぶ
メソッド チェーン を可能にして 使いやすく した バージョン
ちなみに、 配列のmapメソッドも同じです
モナド
今までは 普通の関数を文脈内で 扱えるようにした
では、 文脈を生成するような関数に 対しても文脈内で扱えるだろうか
fl 結論から話すと、 atMap が必要となる
Maybe という失敗 するかもしれない型 今回はこれが文脈
fl map ではなく atMap を実装 map だと文脈が ネストしてしまう
map だと文脈が ネストしてしまう
None
fl Maybe は atMap により Maybe を生成する関数を 文脈の中でネストせず扱えるよう になった つまりモナドとなった
Maybe は atMap により Maybe を生成する関数を 文脈の中でネストせず扱えるよう になった つまりモナドとなった fl
fl 厳密にはモナド則を満たすには atMap と of が必要
ちなみに、 DBからの取得も Promise などの 不確定という文脈を持つ これらも モナド として扱ったり できる
結論 ファンクタ、モナドは 文脈に包まれた値を 関数が文脈を知らないまま 扱うためのデザインパターン
参考 - 『JavaScript徹底攻略 関数 付録:圏論についての補足』