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
ファンクタからモナド / Functor to Monad
Search
kii310
August 29, 2026
Programming
53
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
130
ディスパッチについて
kii310
1
59
再帰関数は無名関数にできるか?
kii310
2
190
未来は現在からの継続
kii310
3
580
アーキテクチャの一番最初の話
kii310
1
76
カリー化と部分適用
kii310
3
140
抽象に依存する
kii310
1
140
抽象に依存する 〜概論編〜
kii310
2
130
純粋関数からDI
kii310
2
230
Other Decks in Programming
See All in Programming
APNsからLive Activityを開始する話
yumnumm
0
180
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
12
5k
残高管理から台帳サービスへの進化
artoy
1
220
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.9k
Railsバージョンを4倍にした話
optim
0
810
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
380
Next.js: The final boss of Web Performance
guaca
0
350
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
1.2k
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
340
Domain-Driven Transformation
hschwentner
2
2.3k
ChromeでローカルLLM
ryu1013
0
170
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
390
Featured
See All Featured
Between Models and Reality
mayunak
4
520
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
290
Building Applications with DynamoDB
mza
96
7.3k
Un-Boring Meetings
codingconduct
0
470
Mind Mapping
helmedeiros
1
410
Being A Developer After 40
akosma
PRO
92
590k
Balancing Empowerment & Direction
lara
6
1.3k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
Product Roadmaps are Hard
iamctodd
55
13k
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徹底攻略 関数 付録:圏論についての補足』