Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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点セット ● モナドはモナドを愛する人に愛されている ○ モナドを意識した言語は美しいし便利だと思う人もいるし、 そんなの別にいらんという人もいる。 モナド完全に理解した