Slide 1

Slide 1 text

ソフトウェアエンジニアとして モナドを完全に理解する @jooohn1234

Slide 2

Slide 2 text

Jun Tomioka @jooohn1234 Software Engineer at M3, Inc. 2歳になったつむぎ

Slide 3

Slide 3 text

子育て世代の エンジニア あるある

Slide 4

Slide 4 text

パパ

Slide 5

Slide 5 text

モナド って なに?

Slide 6

Slide 6 text

パパ モナドって なに?

Slide 7

Slide 7 text

ソフトウェアエンジニアとして モナドを完全に理解する ● モナドはおおざっぱにいうと何者なのか ● モナドは本当は何者なのか ● モナドはなぜ愛されるのか

Slide 8

Slide 8 text

ソフトウェアエンジニアとして モナドを完全に理解する ● モナドはおおざっぱにいうと何者なのか ● モナドは本当は何者なのか ● モナドはなぜ愛されるのか

Slide 9

Slide 9 text

モナドの初見のイメージ やせいの モナド が あらわれた!▼

Slide 10

Slide 10 text

モナドをちょっとググったとき モナドを理解する - 迷える者への手引き モナドはポケモン。 モナドのすべて モナドはメタファーではない モナドは、計算を表現する構造である。 絶対に理解出来ないモナドチュートリアル 「モナドは単なる自己関手の圏におけるモノ イド対象だよ。何か問題でも?」 圏論 アプリカティブファンクタ

Slide 11

Slide 11 text

モナドをちょっとググった感想 なんかわかんな いけどすごい

Slide 12

Slide 12 text

おおざっぱに いうと

Slide 13

Slide 13 text

ソフトウェア エンジニア にとって

Slide 14

Slide 14 text

モナドとは

Slide 15

Slide 15 text

いい感じに flatMap できるやつ

Slide 16

Slide 16 text

モナドは いい感じに flatMap できるやつ

Slide 17

Slide 17 text

いい感じにflatMapできるやつの例

Slide 18

Slide 18 text

例の flatMap に共通したシグネチャ F[A] => (A => F[B]) => F[B]

Slide 19

Slide 19 text

ここでいうFは何者なのか ● 型パラメータを1つとる任意の高カインド型 ○ いわゆる「ジェネリックな型」 ● ここでいうFの例 ○ List, Option ○ Either[Error, ?] ■ LeftがErrorに固定されており、Right1つだけの型パラメータを取る ● ここでいうFではない例 ○ 型パラメータを取らない ■ Int, String, List[Int] ○ 型パラメータを取りすぎ ■ Either[?, ?]

Slide 20

Slide 20 text

あらためて flatMap のシグネチャを確認 Option[String] => (String => Option[Int]) => Option[Int] Array[number] => (number => Array[string]) => Array[string]

Slide 21

Slide 21 text

おおざっぱにいうとモナドは いい感じにflatMapできるやつ おおざっぱに 理解した

Slide 22

Slide 22 text

ソフトウェアエンジニアとして モナドを完全に理解する ● モナドはおおざっぱにいうと何者なのか ● モナドは本当は何者なのか ● モナドはなぜ愛されるのか

Slide 23

Slide 23 text

flatMapできるといっても、 F[A] => (A => F[B]) => F[B] の シグネチャであれば なんでもいいの?

Slide 24

Slide 24 text

ちゃんというと、モナドは3点セット ● モナド3点セット (関数名はなんでもよい) ○ 高カインド型F ○ 関数その1 (flatMap): F[A] => (A => F[B]) => F[B] ○ 関数その2 (pure): A => F[A] ● さらにこの3点セットが、ある法則を満たすとき、こ れらはモナドである! ○ この法則をモナド則という

Slide 25

Slide 25 text

モナド則 (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はメソッドの形で用いている。 )

Slide 26

Slide 26 text

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) ● モナド則を満たすか確かめてみよう! きがむいたらやろう

Slide 27

Slide 27 text

ちゃんというと、モナドは モナド則を 満たす 3点セット

Slide 28

Slide 28 text

モナド 完全に理解した

Slide 29

Slide 29 text

ソフトウェアエンジニアとして モナドを完全に理解する ● モナドはおおざっぱにいうと何者なのか ● モナドは本当は何者なのか ● モナドはなぜ愛されるのか

Slide 30

Slide 30 text

モナドがなんなのかは わかったけど、 それで何が嬉しいの?

Slide 31

Slide 31 text

モナドは

Slide 32

Slide 32 text

便利

Slide 33

Slide 33 text

モナドは 便利

Slide 34

Slide 34 text

モナドはネストをフラットにできる ● ネストしたnullable ○ 見るに堪えない

Slide 35

Slide 35 text

モナドはネストをフラットにできる ● flatMapを用いてフラットにしたもの ○ F[A]の Aに対してネストした操作が綺麗にできる

Slide 36

Slide 36 text

モナドは合成できる ● 別々のF[A], F[B]を合成して F[(A, B)]を作ることが できる ○ map は flatMap + pure で定義できる

Slide 37

Slide 37 text

モナドは合成できる ● モナドの合成を意識したsyntax sugar ○ for (Scala), do (Haskell) ○ チェインのような形ではなく、合成する際は特にこのsyntax sugarが便利

Slide 38

Slide 38 text

JSの非同期処理の進化との比較 JS非同期処理 Scalaの例 コールバック地獄 Promise.thenによる flatなチェイン async / await

Slide 39

Slide 39 text

モナド(っぽいなにか) を扱う syntax sugar JS Scala 非同期処理のネスト async / await for 式 Optionalな値のネスト Optional chaining (合成、中身を別の関数の引数として渡す といった用途では使えない) for 式 ● モナドを意識したsyntax sugarを用意している言語では、各モ ナド (っぽいなにか) に対して一貫した記述ができる。 ● このシンプルさもモナドを愛される理由の1つ シンプルではある

Slide 40

Slide 40 text

実用上は Optional chaining や async / awaitがあればそれ で十分なような気がするけど

Slide 41

Slide 41 text

便利なモナドって 他にたくさんあるの?

Slide 42

Slide 42 text

便利なモナドを一部紹介 ● Either[A, B] ○ 慣習的にRightにハッピーなケースを入れることが多く、 Either[Error, ?]の形でLeftを固定して使うことが多い。 ○ エラーハンドリングに便利。 これは 使いそう

Slide 43

Slide 43 text

● State[S, A] ○ S => (S, A) のラッパー ■ Sを置き換えながらAを返す。 ○ パーサを書いたりするときに便利 ■ List[Token]を受け取り、処理後のList[Token]とparse結果Aを返す 便利なモナドを一部紹介 ふーん

Slide 44

Slide 44 text

便利なモナドを一部紹介 ● モナドトランスフォーマー ○ 一部のモナドは別のモナドと組み合わせて別のモナドを構 成することができる。 ■ Transformer から、Tをsuffixとして、EitherT などとよぶことが多い ■ EitherT + State で 読み取り失敗する可能性のあるParser など ○ 名前にロマンがある

Slide 45

Slide 45 text

使うかしらんけど 便利っぽい

Slide 46

Slide 46 text

その他モナドが愛される理由(個人の感想) ● 数学・圏論由来の抽象化である安心感 ○ 正しい抽象化は思いの外むずかしい ○ “prefer duplication over the wrong abstraction” ■ https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction ?duplication ● 困ったときに会話を煙にまくことができる ○ 「あっごめん、モナドのこと考えてた」 ■ 話を聞いてなかったときに ○ 「でもそれってモナド則満たしてるの?」 ■ 相手の主張がモナド則満たしてないなと思ったときに

Slide 47

Slide 47 text

まとめ ● モナドを完全に理解した ○ モナドはモナド則を満たす3点セット ● モナドはモナドを愛する人に愛されている ○ モナドを意識した言語は美しいし便利だと思う人もいるし、 そんなの別にいらんという人もいる。 モナド完全に理解した