Answers:
这句话背后的原因是,您可以用对flatMap(以及其他高阶函数)的调用来替换许多繁琐的if / then / else代码。
对于选项尤其如此(请参阅http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/)
但这也适用于其他单子(尽管我必须承认,我本人还不完全了解细节)
想象一下您有一个要应用一个函数(或一系列函数)的集合的情况,其中每个函数都可能返回null。当您实际使用null时,您的代码将充满null检查。但是,如果您使用选项而不是值,则可以使用所需的函数对值进行平面映射,在使用多个函数的情况下将函数链接起来,并获得结果不为null的集合,这在许多情况下正是这样你要。
由于该描述相当复杂,因此较短的建议“只是该死的平面图”确立了自己的地位。
我听到的故事是,当其中一位杰出的Scala程序员开始编写如下代码时,他们正在配对:
option match {
case Some ...
对方在这时说:“这是什么?业余时间?该死的平面图!”
关于什么那么强大flatMap
,好吧...首先,它是基本的单子运算符。这意味着它是一种常见的操作,例如,由容器(如Option
,集合等),延续,状态等共享。其次,虽然您可以解构一个,但与之Option
相反flatMap
,它不是一元运算,因此无法广泛应用。此外,它还需要太多有关所处理数据的知识。
注意:之前我说过匹配速度慢flatMap
-事实上,事实恰恰相反,直到撰写本文时最新版本的Scala 2.10.1。)
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
。我可以添加更多的monad,删除monad,并且保持不变。另外,请注意,它不会分解为String
,而是分解为Option[String]
。尽管实际上,它根本不会分解。某些人不喜欢使用容器作为monad的示例的原因之一是您可以从容器中取出东西,但并非所有monad都允许您这样做。
至关重要的flatMap
是,它是Scala对Monadic绑定操作的表示。网络上有许多教程,它们解释了monad的用途以及它们为何如此有用的原因。詹姆斯·伊里(James Iry)有一个细节。
Option
只是许多flatMap
用例之一。当然,如果您想在其“自然栖息地”中观察单子,则应检查Haskell。唯一的不同是,Haskellers说:“只是>> =那该死!”