Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C#でわかる こわくないMonad

C#でわかる こわくないMonad

Monad(モナド)とは何か?という問いには、様々なアプローチでの解説が試みられていますが、函数(関数)にまつわるトピックであり、抽象度が非常に高いために理解しがたいものです。

このスライドでは、MonadをC#言語を使って掘り下げることで、基本的な考え方についての足掛かりになるように構成しました。そのため、厳密な定義は含まれていないため、数学的なアプローチを参照したい場合には向きません。

このスライドは「F# 勉強会 岐阜」で発表しました。
https://connpass.com/event/52666/

Kouji Matsui

May 27, 2017
Tweet

More Decks by Kouji Matsui

Other Decks in Programming

Transcript

  1. Kouji Matsui - kekyo • NAGOYA city, AICHI pref., JP

    • Twitter – @kekyo2 / Facebook • ux-spiral corporation • Microsoft Most Valuable Professional VS and DevTech 2015- • Certified Scrum master / Scrum product owner • Center CLR organizer. • .NET/C#/F#/IL/metaprogramming or like… • Bike rider
  2. Nullを安全になんとかしたい .NET Frameworkの進化: • Dictionary<TKey, TValue> : .NET 2.0で追加された。 •

    bool TryGetValue(TKey key, out TValue value) boolの判定を強制させることで、 失敗についてコード化させる。 が、モヤモヤする…
  3. 処理の連鎖 LINQで異なるところは: • Return(value)がnew[] { value } // 要素1個だけの配列の生成 •

    Bind()がSelectMany() // ネストしたリストのアンループ です。 ※最後の出力はMatchがないので、foreachで出力しています。 ※bindがflatMapと呼ばれる事から、SelectManyに近しい感じもします。
  4. F#でのシーケンス ここではシーケンス式自体はあまり掘り下げませんが、F#はこの 「ブロックで囲まれた式」をビルトインで定義しています: •シーケンス向き(Seq<T>) : seq { … } •非同期処理向き(Async<T>)

    : async { … } •DBクエリ向き(IQueryable<T>) : query { … } そして、これらビルトインワークフロー以外にも: •独自の計算定義 : hogehoge { … } → コンピュテーション式
  5. コンピュテーション式の導入 コンピュテーション式の利点: • C# LINQクエリ構文と比べ、より自然で適した文法にしやすい。 使用可能なキーワードが多い。 let, do, return, for..do,

    try..finally, use, yieldなど、大体網羅出来る • ビルトインワークフロー群と同じ手法で拡張でき、LINQの制約 に縛られない。 • バックエンドはほぼモナドそのまま。 「Computation Expressions」 https://docs.microsoft.com/en- us/dotnet/fsharp/language-reference/computation-expressions
  6. モナドとは? C#での、モナドの適用動機: • 正直、あまりない(だから知識共有されない?)。 • LINQの演算子がモナドっぽいけど、普段意識することはない。 • 文(Statement : voidな手続き)とは相性が悪い。Bindに渡す関数が

    値を返せない。 F#での、モナドの適用動機: • 関数型プログラミング言語では一般的に使われる概念(?)。全て の式が値を返すので、自然に導入できる。 • コンピュテーション式で自然に拡張・記述しやすく出来る
  7. 謝辞 • 「モナドの脅威」 matarillo.com http://matarillo.com/general/monads.php • 「もしC#プログラマーがMaybeモナドを実装したら」 gab_km http://blog.livedoor.jp/gab_km/archives/1361759.html •

    「Optionに見るコンピュテーション式のつくり方」 bleis-tift http://bleis-tift.hatenablog.com/entry/how-to-make- computation-expression