Scalaの「フラットマップs ***」慣用表現はどこから来たのですか?


104

Scalaの民間伝承でこのような場所に値するほどフラットマップの強力なものは何ですか?


30
[引用が必要]
tstenner '19

1
for言語リファレンスのコンパイラーが式を処理する方法に関するセクションを読んでください。それはいくつかのヒントを与えるかもしれません。
ディルク

@tstenner:簡潔なミームに頼っている限り:Googleはあなたの友達です。
チャック

4
@aishwarya「悪い」のような「たわごと」ではなく、「リスト/配列/オプションでフラットマップを使用する」のようなものです
tstenner

1
実際、その特定のフレーズは(もちろん)マンハッタンのどこかにあるバー(リーダー)モナドを見逃したという文脈から外されました;-)このような場合に発生するように、ショートバージョンはスタックしました。
Roland Kuhn

回答:


55

このフレーズの背後にある理由は、作成する面倒なif / then / elseコードの多くをflatMap(およびその他の高次関数)の呼び出しに置き換えることができるということです。

これは特にオプションに当てはまります(http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/を参照)

しかし、それは他のモナドにも適用されます(私は認めざるを得ませんが、私自身はまだ詳細を正確に理解していません)

各関数がnullを返す可能性がある関数(または一連の関数)を適用するコレクションがある状況を想像してみてください。実際にnullを使用すると、コードはnullチェックでだらだらになります。ただし、値の代わりにオプションを使用する場合は、目的の関数を使用して値をフラットマップし、複数の関数の場合は関数を連鎖させて、nullでない結果のみを含むコレクションを取得できます。あなたが欲しい。

その説明はかなり複雑であるため、「たわごとだけのフラットマップ」という短いアドバイスが確立されました。


私は個人的にリストモナドを使って組み合わせを処理しています。
Dan Burton

103

私が聞いた話は、2人の卓越したScalaプログラマーが次のようなコードを書き始めたときにペアリングしていたというものでした。

option match {
    case Some ...

もう一方は、「これは何ですか?アマチュアアワー?フラットな地図だ!」と言いました。

についての強力な点についてはflatMap、まあ...まず、それは基本的なモナド演算子です。これは、たとえば、コンテナ(Optionコレクションなど)、継続、状態などで共有される一般的な操作であることを意味します。次に、とはOption対照的にflatMap、モナド演算ではないを分解できますなので、それほど広く適用することはできません。また、操作しているデータに関する知識が多すぎます。

注:以前、マッチングは遅いと述べましたflatMap-実際のところ、この記事の執筆時点での最新バージョンの2.10.1までは、その逆です。


4
私はまだアマチュアアワーにいると思います:-)
Guillaume Belrose

69
それらの2人のプログラマーは私とPaul Chiusanoでした。
Apocalisp 2011

1
私が正しく思い出すと、#legendofklangがツイッターで同時に現れたのではありませんか...これは、しばしば、ミームを意味するフラットマップのミス属性の根源です?ある種のScalaミームwikiエントリを作成する必要があります。今、素晴らしいものがあります!
timothy

3
@WillSargentそれは木の森が欠けていると思います。利点は、それが構成することです。4つのモナドに依存する関数があれば、と書くことができますval res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)。さらにモナドを追加したり、モナドを削除したりしても、同じままです。また、それは内に分解しないことに注意してくださいString、しかしにOption[String]。しかし、実際には、それはまったく分解しません。モナドの例としてコンテナを好まない人がいる理由の1つは、コンテナから物を取り出すことができるということですが、すべてのモナドでそれができるわけではありません。
ダニエルC.ソブラル2011

1
:あなたはここに引用された議論へのリンクを見ることができますweb.archive.org/web/20130627111326/http://beust.com/weblog/2010/...
ホークアイ

12

重要なことflatMapは、それがモナドのバインド操作のScalaの表現であることです。モナドの目的と、モナドが非常に有用である理由を説明するチュートリアルがWebに数多くあります。ジェームス・アイリーは、いくつかの詳細に入るもの持っています。


4
これは正解だと思います。これはOption多くのflatMap使用例の1つにすぎません。もちろん、モナドを「自然の生息地」で観察したい場合は、Haskellをチェックしてください。唯一の違いは、Haskellersが「>> =たわごとだ」と言うことです。
ランデイ

記事へのリンクをありがとう、私はそれが非常に役に立ったと感じました。また、Scalaのプログラミングの「For expression revisited」の章に戻って、forループと、filter、map、flatMap、flattenの使用について説明しました。
Guillaume Belrose、2011

10

Runar Bjarnasonは、起源を探している人です。

なぜこれほど強力なのかを理解することは、正直に言うと時間とともにしか実現できないものです。Optionクラスは、一連のルックアップを(たとえば)繰り返して最終結果にフラットマップする方法を確認するのに最適な場所です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.