Scalaの民間伝承でこのような場所に値するほどフラットマップの強力なものは何ですか?
for
言語リファレンスのコンパイラーが式を処理する方法に関するセクションを読んでください。それはいくつかのヒントを与えるかもしれません。
Scalaの民間伝承でこのような場所に値するほどフラットマップの強力なものは何ですか?
for
言語リファレンスのコンパイラーが式を処理する方法に関するセクションを読んでください。それはいくつかのヒントを与えるかもしれません。
回答:
このフレーズの背後にある理由は、作成する面倒なif / then / elseコードの多くをflatMap(およびその他の高次関数)の呼び出しに置き換えることができるということです。
これは特にオプションに当てはまります(http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/を参照)
しかし、それは他のモナドにも適用されます(私は認めざるを得ませんが、私自身はまだ詳細を正確に理解していません)
各関数がnullを返す可能性がある関数(または一連の関数)を適用するコレクションがある状況を想像してみてください。実際にnullを使用すると、コードはnullチェックでだらだらになります。ただし、値の代わりにオプションを使用する場合は、目的の関数を使用して値をフラットマップし、複数の関数の場合は関数を連鎖させて、nullでない結果のみを含むコレクションを取得できます。あなたが欲しい。
その説明はかなり複雑であるため、「たわごとだけのフラットマップ」という短いアドバイスが確立されました。
私が聞いた話は、2人の卓越したScalaプログラマーが次のようなコードを書き始めたときにペアリングしていたというものでした。
option match {
case Some ...
もう一方は、「これは何ですか?アマチュアアワー?フラットな地図だ!」と言いました。
についての強力な点についてはflatMap
、まあ...まず、それは基本的なモナド演算子です。これは、たとえば、コンテナ(Option
コレクションなど)、継続、状態などで共有される一般的な操作であることを意味します。次に、とはOption
対照的にflatMap
、モナド演算ではないを分解できますなので、それほど広く適用することはできません。また、操作しているデータに関する知識が多すぎます。
注:以前、マッチングは遅いと述べましたflatMap
-実際のところ、この記事の執筆時点での最新バージョンの2.10.1までは、その逆です。
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
。さらにモナドを追加したり、モナドを削除したりしても、同じままです。また、それは内に分解しないことに注意してくださいString
、しかしにOption[String]
。しかし、実際には、それはまったく分解しません。モナドの例としてコンテナを好まない人がいる理由の1つは、コンテナから物を取り出すことができるということですが、すべてのモナドでそれができるわけではありません。
重要なことflatMap
は、それがモナドのバインド操作のScalaの表現であることです。モナドの目的と、モナドが非常に有用である理由を説明するチュートリアルがWebに数多くあります。ジェームス・アイリーは、いくつかの詳細に入るものを持っています。
Option
多くのflatMap
使用例の1つにすぎません。もちろん、モナドを「自然の生息地」で観察したい場合は、Haskellをチェックしてください。唯一の違いは、Haskellersが「>> =たわごとだ」と言うことです。
Runar Bjarnasonは、起源を探している人です。
なぜこれほど強力なのかを理解することは、正直に言うと時間とともにしか実現できないものです。Optionクラスは、一連のルックアップを(たとえば)繰り返して最終結果にフラットマップする方法を確認するのに最適な場所です。