2017-03-14 23 views
1

私はスカラで関数型プログラミングを学んでおり、モナドを学びました。短いモナドは:現実世界におけるモナド理解の応用

trait M[A] { 
    def flatMap[B](f: A => M[B]): M[B] 
} 

def unit[A](x: A): M[A] 

私はモナドが上記の2つのルールに基づいていることを知っています。 、なぜ我々は理解リストのAPIと比較される用語「モナド」を知っておくべき未来のAPIを:そして、我々は、私が知らないだけで一つの問題があるなどListなど、現実の世界では、多くのモナド、Future ....

を満たすことができますまたは何かapis ...理解モナドは私たちがより良いコードを書くのを助けるか、より良い機能コード構造を設計することができますか?

おかげ

答えて

7

をモナドはすでに圏論で知られている用語であるため。 Monadが従わなければならない3つの非常に重要なMonadの法則もあります。

理論的には、私たちは "FlatMappable"または "Bindable"のようなMonadsを呼び出すことができますが、 "Monad"という名前はすでに関数型プログラミングコミュニティの確立された用語であり、Monadの法律。

なぜ、あなたは個々のAPIを個別に学習するよりもMonadsに感謝するべきなのか、それはすべて知識の抽象化と再利用に関するものです。多くの場合、新しいコンセプトを見ると、それらを既に知っているコンセプトと比較します。

未来のモナドについてすでに理解している場合は、タスクモナドを理解する方がはるかに簡単です。

Scalaのfor-comprehensionsはMonadsのみで動作することは言うまでもありません。実際にはfor-comprehensionsflatMapmapの文法的な砂糖です(これはfilterですが、Monadsにはあまり関係ありません)。 Monadのインスタンスがあるかどうかを認識することで、この余分な構文的な砂糖を利用することができます。

また、抽象化を完全に把握したら、モナドの実際のタイプの重要性が低いモナドトランスフォーマーのような概念を利用できます。

最後には、ここでは完全酒のためのモナドの法則です:

  • 左アイデンティティ:M[F].pure(x).flatMap(f) == f(x)
  • 右アイデンティティ:m.flatMap(pure(_)) == m
  • 関連性:コンクリートのAPI対m.flatMap(f).flatMap(g) == m.flatMap(x => f(x).flatMap(g))
0

についてモナドのAPI :

leはFree Monadのパターンになる可能性があります。それは必然的に(少なくとも)2つのモナドを使います:最初はDSLの式をラッピングし、2つ目はエフェクトモナドです。つまり、式を解釈するモダリティです(オプションは失敗する可能性があります。 )。

具体的には、レイテンシがあるタスクを考えて、Futuresを使用することにします。ユニットテストはどうしますか?いくつかの先物を返し、そしてAwaitを使う?不要な複雑さを追加するだけでなく、いくつかの問題にぶつかることがあります。そして、実際にはいくつかのテストでFuturesを使用する必要はありません。答えは、MonadでFuturesを使用するはずのメソッドをパラメータ化することです。したがって、IdentityモナドまたはOptionを使用するだけで、上記の問題を忘れることができます。

関連する問題