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
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-...
Search
Jun Tomioka
December 13, 2019
Technology
8k
14
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
モナドを完全に理解する
Jun Tomioka
December 13, 2019
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
390
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
jooohn
1
1.2k
Write stack safe non-tailrec recursive functions
jooohn
4
1k
Introduction to Clean Architecture
jooohn
1
620
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.8k
Work at M3 USA
jooohn
0
1.5k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.4k
怖くないCats
jooohn
0
930
Scalaの型クラスを完全に理解する
jooohn
5
2.1k
Other Decks in Technology
See All in Technology
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
4
700
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
150
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
140
負債のメタファと2026年 / Debt Metaphor in Agentic Engineering Age 202609 Edition
twada
PRO
11
6.4k
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
140
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
270
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
nenonaninu
1
1.3k
2026_devsumi_ozono.pdf
o3
3
580
データ_AIの事業の勝敗をわけるもの
nek0128
1
480
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
280
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
470
Oracle Cloud Network Path Analyzerを試してみた/I Tried Out Oracle Cloud Network Path Analyzer
masakiokuda
1
110
Featured
See All Featured
Building an army of robots
kneath
307
46k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
730
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Exploring anti-patterns in Rails
aemeredith
4
510
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
370
Mobile First: as difficult as doing things right
swwweet
225
10k
Claude Code のすすめ
schroneko
67
230k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
280
Scaling GitHub
holman
464
140k
Transcript
ソフトウェアエンジニアとして モナドを完全に理解する @jooohn1234
Jun Tomioka @jooohn1234 Software Engineer at M3, Inc. 2歳になったつむぎ
子育て世代の エンジニア あるある
パパ
モナド って なに?
パパ モナドって なに?
ソフトウェアエンジニアとして モナドを完全に理解する • モナドはおおざっぱにいうと何者なのか • モナドは本当は何者なのか • モナドはなぜ愛されるのか
ソフトウェアエンジニアとして モナドを完全に理解する • モナドはおおざっぱにいうと何者なのか • モナドは本当は何者なのか • モナドはなぜ愛されるのか
モナドの初見のイメージ やせいの モナド が あらわれた!▼
モナドをちょっとググったとき モナドを理解する - 迷える者への手引き モナドはポケモン。 モナドのすべて モナドはメタファーではない モナドは、計算を表現する構造である。 絶対に理解出来ないモナドチュートリアル 「モナドは単なる自己関手の圏におけるモノ
イド対象だよ。何か問題でも?」 圏論 アプリカティブファンクタ
モナドをちょっとググった感想 なんかわかんな いけどすごい
おおざっぱに いうと
ソフトウェア エンジニア にとって
モナドとは
いい感じに flatMap できるやつ
モナドは いい感じに flatMap できるやつ
いい感じにflatMapできるやつの例
例の flatMap に共通したシグネチャ F[A] => (A => F[B]) => F[B]
ここでいうFは何者なのか • 型パラメータを1つとる任意の高カインド型 ◦ いわゆる「ジェネリックな型」 • ここでいうFの例 ◦ List, Option
◦ Either[Error, ?] ▪ LeftがErrorに固定されており、Right1つだけの型パラメータを取る • ここでいうFではない例 ◦ 型パラメータを取らない ▪ Int, String, List[Int] ◦ 型パラメータを取りすぎ ▪ Either[?, ?]
あらためて flatMap のシグネチャを確認 Option[String] => (String => Option[Int]) => Option[Int]
Array[number] => (number => Array[string]) => Array[string]
おおざっぱにいうとモナドは いい感じにflatMapできるやつ おおざっぱに 理解した
ソフトウェアエンジニアとして モナドを完全に理解する • モナドはおおざっぱにいうと何者なのか • モナドは本当は何者なのか • モナドはなぜ愛されるのか
flatMapできるといっても、 F[A] => (A => F[B]) => F[B] の シグネチャであれば
なんでもいいの?
ちゃんというと、モナドは3点セット • モナド3点セット (関数名はなんでもよい) ◦ 高カインド型F ◦ 関数その1 (flatMap): F[A]
=> (A => F[B]) => F[B] ◦ 関数その2 (pure): A => F[A] • さらにこの3点セットが、ある法則を満たすとき、こ れらはモナドである! ◦ この法則をモナド則という
モナド則 (Monad Laws) • 以下を満たす (ただし、a: A, f: A =>
F[B], fa: F[A], g: B => F[C]) ◦ Left Identity ▪ pure(a).flatMap(f) == f(a) ◦ Righty Identity ▪ fa.flatMap(pure) == fa ◦ Associativity ▪ fa.flatMap(f).flatMap(g) == f.flatMap(x => f(x).flatMap(g)) • このへんがいい感じの部分 (ここではflatMapはメソッドの形で用いている。 )
Optionモナドの例 • Optionモナドの3点セット ◦ 高カインド型F ▪ Option ◦ flatMap: (fa:
F[A]) => (f: (A => F[B])) => F[B] ▪ fa match { Some(a) => f(a) None => None } ◦ pure: (a: A) => F[A] ▪ a => Some(a) • モナド則を満たすか確かめてみよう! きがむいたらやろう
ちゃんというと、モナドは モナド則を 満たす 3点セット
モナド 完全に理解した
ソフトウェアエンジニアとして モナドを完全に理解する • モナドはおおざっぱにいうと何者なのか • モナドは本当は何者なのか • モナドはなぜ愛されるのか
モナドがなんなのかは わかったけど、 それで何が嬉しいの?
モナドは
便利
モナドは 便利
モナドはネストをフラットにできる • ネストしたnullable ◦ 見るに堪えない
モナドはネストをフラットにできる • flatMapを用いてフラットにしたもの ◦ F[A]の Aに対してネストした操作が綺麗にできる
モナドは合成できる • 別々のF[A], F[B]を合成して F[(A, B)]を作ることが できる ◦ map は
flatMap + pure で定義できる
モナドは合成できる • モナドの合成を意識したsyntax sugar ◦ for (Scala), do (Haskell) ◦
チェインのような形ではなく、合成する際は特にこのsyntax sugarが便利
JSの非同期処理の進化との比較 JS非同期処理 Scalaの例 コールバック地獄 Promise.thenによる flatなチェイン async / await
モナド(っぽいなにか) を扱う syntax sugar JS Scala 非同期処理のネスト async / await
for 式 Optionalな値のネスト Optional chaining (合成、中身を別の関数の引数として渡す といった用途では使えない) for 式 • モナドを意識したsyntax sugarを用意している言語では、各モ ナド (っぽいなにか) に対して一貫した記述ができる。 • このシンプルさもモナドを愛される理由の1つ シンプルではある
実用上は Optional chaining や async / awaitがあればそれ で十分なような気がするけど
便利なモナドって 他にたくさんあるの?
便利なモナドを一部紹介 • Either[A, B] ◦ 慣習的にRightにハッピーなケースを入れることが多く、 Either[Error, ?]の形でLeftを固定して使うことが多い。 ◦ エラーハンドリングに便利。
これは 使いそう
• State[S, A] ◦ S => (S, A) のラッパー ▪
Sを置き換えながらAを返す。 ◦ パーサを書いたりするときに便利 ▪ List[Token]を受け取り、処理後のList[Token]とparse結果Aを返す 便利なモナドを一部紹介 ふーん
便利なモナドを一部紹介 • モナドトランスフォーマー ◦ 一部のモナドは別のモナドと組み合わせて別のモナドを構 成することができる。 ▪ Transformer から、Tをsuffixとして、EitherT などとよぶことが多い
▪ EitherT + State で 読み取り失敗する可能性のあるParser など ◦ 名前にロマンがある
使うかしらんけど 便利っぽい
その他モナドが愛される理由(個人の感想) • 数学・圏論由来の抽象化である安心感 ◦ 正しい抽象化は思いの外むずかしい ◦ “prefer duplication over the
wrong abstraction” ▪ https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction ?duplication • 困ったときに会話を煙にまくことができる ◦ 「あっごめん、モナドのこと考えてた」 ▪ 話を聞いてなかったときに ◦ 「でもそれってモナド則満たしてるの?」 ▪ 相手の主張がモナド則満たしてないなと思ったときに
まとめ • モナドを完全に理解した ◦ モナドはモナド則を満たす3点セット • モナドはモナドを愛する人に愛されている ◦ モナドを意識した言語は美しいし便利だと思う人もいるし、 そんなの別にいらんという人もいる。
モナド完全に理解した