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
21
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
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
3.8k
Flow は今どうなっているか
mizdra
PRO
0
760
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
120
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
170
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
560
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
230
高専キャリア LT 発表内容
crysta1221
4
4.2k
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
260
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
250
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
200
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
220
AIの中の人になってみる
htkym
0
140
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Designing Experiences People Love
moore
143
24k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
650
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Thoughts on Productivity
jonyablonski
76
5.3k
Navigating Weather and Climate Data
rabernat
0
490
RailsConf 2023
tenderlove
30
1.5k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
420
A Tale of Four Properties
chriscoyier
163
24k
GraphQLとの向き合い方2022年版
quramy
50
15k
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徹底攻略 関数 付録:圏論についての補足』