Scala中惯用的表达“ s ***的平面图”从何而来?


104

平面图有什么功能如此强大,以至于在Scala民俗学中应有如此地位?


30
[需要引用]
tstenner 2011年

1
阅读for语言参考中有关编译器如何处理表达式的部分。它可能会给出一些提示。
德克

@tstenner:只要我们依靠简洁的模因:Google是您的朋友。
Chuck

4
@aishwarya它更像是“仅在列表/数组/选项上使用平面图”,而不是“糟糕”中的“
污点

1
实际上,该特定短语(当然)是从上下文中提取出来的,其中有人在曼哈顿某处错过了Bar(阅读器)monad ;-)在这种情况下,简短的版本卡住了。
罗兰·库恩

Answers:


55

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

对于选项尤其如此(请参阅http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/

但这也适用于其他单子(尽管我必须承认,我本人还不完全了解细节)

想象一下您有一个要应用一个函数(或一系列函数)的集合的情况,其中每个函数都可能返回null。当您实际使用null时,您的代码将充满null检查。但是,如果您使用选项而不是值,则可以使用所需的函数对值进行平面映射,在使用多个函数的情况下将函数链接起来,并获得结果不为null的集合,这在许多情况下正是这样你要。

由于该描述相当复杂,因此较短的建议“只是该死的平面图”确立了自己的地位。


我个人有时会使用列表单子来处理组合。
丹·伯顿

103

我听到的故事是,当其中一位杰出的Scala程序员开始编写如下代码时,他们正在配对:

option match {
    case Some ...

对方在这时说:“这是什么?业余时间?该死的平面图!”

关于什么那么强大flatMap,好吧...首先,它是基本的单子运算符。这意味着它是一种常见的操作,例如,由容器(如Option,集合等),延续,状态等共享。其次,虽然您可以解构一个,但与之Option相反flatMap,它不是一元运算,因此无法广泛应用。此外,它还需要太多有关所处理数据的知识。

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


4
我想那时我仍处于业余时间:-)
Guillaume Belrose

69
那两个程序员是我自己和Paul Chiusano。
Apocalisp

1
如果我没记错的话,#legendofklang难道不是在同一时间在Twitter上露面吗……这通常是导致模因失误的平面图误导的根源吗?我们应该做一些Scala meme Wiki条目;现在有一些很棒的!
蒂莫西

3
@WillSargent我认为这是缺少树木的森林。优点是它组成。如果我有一个依赖四个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都允许您这样做。
Daniel C. Sobral


12

至关重要的flatMap是,它是Scala对Monadic绑定操作的表示。网络上有许多教程,它们解释了monad的用途以及它们为何如此有用的原因。詹姆斯·伊里(James Iry)有一个细节。


4
我认为这是正确的答案,Option只是许多flatMap用例之一。当然,如果您想在其“自然栖息地”中观察单子,则应检查Haskell。唯一的不同是,Haskellers说:“只是>> =那该死!”
兰代2011年

感谢您提供这篇文章的链接,我发现它非常有用。我还回到了Scala编程中的“重新访问表达式”一章,该章为for循环及其对filter,map,flatMap和flatten的使用提供了一些启示。
Guillaume Belrose

10

Runar Bjarnason是您要寻找起源的人。

坦白地说,意识到它为何如此强大的原因只有时间。Option类是开始了解如何重复将一系列查找(例如)平坦化为最终结果的最佳场所。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.