Scala中"s***"惯用表达的平面图来自何处?

Gui*_*ose 103 scala

平板图的强大之处在于它在Scala民间传说中应该得到这样的地方吗?

Dan*_*ral 102

我听到的故事是两个杰出的Scala程序员在配对时,其中一个开始编写这样的代码:

option match {
    case Some ...
Run Code Online (Sandbox Code Playgroud)

此时另一个人说"这是什么?业余时间?平面地图那个狗屎!"

至于什么是如此强大flatMap,嗯...首先,它是基本的monadic运算符.这意味着它是一个共同的操作,例如,容器(例如Option,集合等),延续,状态等等.其次,虽然你可以解构一个Option,而flatMap不是一个monadic操作,所以它不能广泛应用.此外,它需要太多关于您正在操作的数据的知识.

注意:之前我说过匹配比速度慢flatMap- 事实上情况恰恰相反,直到最新版本的Scala,在撰写本文时,2.10.1.)

  • 这两个程序员是我自己和Paul Chiusano. (68认同)
  • 我想我还在业余时间:-) (4认同)
  • @WillSargent我认为那是树木的森林.它的优点是_composes_.如果我有一个依赖于四个monad的函数,我可以写`val res = for(a < - ma; b < - mb; c < - mc; d < - md)yield f(a,b,c,d )`.我可以添加更多monad,删除monad,它保持不变.另外,请注意它不会分解为`String`,而是分解为`Option [String]`.实际上,它根本没有分解.一些人不喜欢使用容器作为monad的例子的原因之一是你可以从容器中取出东西,但不是所有monad都允许你这样做. (3认同)

Jen*_*der 54

这句话背后的原因是,您可以使用对flatMap(以及其他更高阶函数)的调用来替换很多繁琐的if/then/else代码.

选项尤其如此(参见http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/)

但它也适用于其他monad(虽然我不得不承认,我自己并不完全理解细节)

想象一下您有一个集合要为其应用函数(或一系列函数)的情况,其中每个函数可能返回null.当您实际使用null时,您的代码将充满空检查.但是,如果你使用的选项,而不是值,你可以用flatmap所需的函数值,链接的功能的多种功能的情况下,并得到一个集合,只是不为空,这在很多情况下,是什么结果你要.

由于这种描述相当令人费解,因此较短的建议"只是简单地说明了".


Sub*_*oid 12

关键flatMap是它是Scala对monadic绑定操作的表示.网上有很多教程解释monad的目的以及为什么它们如此有用; James Iry有一个细节.

  • 我认为这是正确的答案,`Option`只是众多`flatMap`用例中的一个.当然,如果你想在他们的"自然栖息地"观察monad,你应该看看Haskell.唯一的区别是Haskellers说:"Just >> =那个狗屎!" (3认同)

Sea*_*ons 9

Runar Bjarnason是你寻找起源的人.

意识到为什么它如此强大是一种只有时间才能诚实的东西.Option类是开始查看如何将一系列查找(例如)重复平面映射到最终结果的最佳位置.