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
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-...
Search
Jun Tomioka
December 13, 2019
Technology
14
7.9k
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
モナドを完全に理解する
Jun Tomioka
December 13, 2019
Tweet
Share
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
360
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
jooohn
1
1.1k
Write stack safe non-tailrec recursive functions
jooohn
4
980
Introduction to Clean Architecture
jooohn
1
580
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.7k
Work at M3 USA
jooohn
0
1.4k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.3k
怖くないCats
jooohn
0
860
Scalaの型クラスを完全に理解する
jooohn
5
2k
Other Decks in Technology
See All in Technology
「アウトプット脳からユーザー価値脳へ」がそんなに簡単にできたら苦労しない #RSGT2026
aki_iinuma
11
5.1k
AI との良い付き合い方を僕らは誰も知らない (WSS 2026 静岡版)
asei
1
300
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
220
投資戦略を量産せよ 2 - マケデコセミナー(2025/12/26)
gamella
1
640
#22 CA × atmaCup 3rd 1st Place Solution
yumizu
1
170
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
1
100
Databricks Free Editionで始めるLakeflow SDP
taka_aki
0
100
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
12k
Everything As Code
yosuke_ai
0
510
Databricks Free Edition講座 データエンジニアリング編
taka_aki
0
2.6k
戰略轉變:從建構 AI 代理人到發展可擴展的技能生態系統
appleboy
0
190
国井さんにPurview の話を聞く会
sophiakunii
1
370
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
120
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
41
Abbi's Birthday
coloredviolet
0
4.3k
Paper Plane (Part 1)
katiecoart
PRO
0
3k
Crafting Experiences
bethany
0
29
Discover your Explorer Soul
emna__ayadi
2
1k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
100
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Typedesign – Prime Four
hannesfritz
42
2.9k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
120
Making the Leap to Tech Lead
cromwellryan
135
9.7k
ラッコキーワード サービス紹介資料
rakko
0
2M
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点セット • モナドはモナドを愛する人に愛されている ◦ モナドを意識した言語は美しいし便利だと思う人もいるし、 そんなの別にいらんという人もいる。
モナド完全に理解した