Scala的“平面地图”在Scala中的惯用expression从何而来?
什么是如此强大的平面地图,它应该在斯卡拉民俗的这样一个地方?
这个短语背后的原因是,你可以用flatMap(和其他高阶函数)的调用来代替很多繁琐的if / then / else代码。
对于选项尤其如此(参见http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
但它也适用于其他monad(虽然我不得不承认,我自己并不完全了解细节)
想象一下你有一个你想要应用一个函数(或者一系列函数)的集合,每个函数可能返回null。 当你实际使用null时,你的代码将被全面检查。 但是,如果使用Options而不是值,则可以将值与所需的函数进行平面映射,在多个函数的情况下将函数链接在一起,并获得仅包含非空结果的集合,在许多情况下你要。
由于这个描述是相当复杂的,较短的build议“只是扁平的那个狗屎”确立了自己。
我听到的故事是两个杰出的Scala程序员正在配对,当他们中的一个开始写这样的代码:
option match { case Some ...
另一个人说:“这是什么?业余时间?平面地图,狗屎!
至于flatMap
的function如此强大,嗯…首先,它是最基本的一元运算符。 这意味着这是一个共同的操作,例如容器(比如Option
,集合等),continuation,state等共享。第二,尽pipe你可以构造一个Option
,但与flatMap
是,一个单一的操作,所以它不能被广泛应用。 另外,它需要太多关于你正在操作的数据的知识。
注意:之前我说过匹配比flatMap
慢 – 事实恰恰相反,直到写作本文时为止的最新版本的Scala 2.10.1。)
关于flatMap
的关键在于它是Scala对monadic绑定操作的表示。 网上有很多教程来解释monads的目的,为什么它们非常有用; 詹姆斯·伊里有一个细节。
Runar Bjarnason是你正在寻找原产地的人。
意识到为什么它如此强大,只能随着时间的推移才能真正实现。 Option类是开始查看如何将一系列查找(例如)重复平面地图映射到最终结果的最佳位置。