如何在Scala中提高理解力?

时间:2019-01-10 07:46:10

标签: scala yield for-comprehension

阅读此article并意识到在yield关键字之后的几乎所有功能都是map功能。 for中的所有语句都是flatMap函数。为什么呢?为什么yield之后的函数是flatMap函数,而for中的函数又是map函数?

1 个答案:

答案 0 :(得分:1)

您的第一点大致正确。声明

for (x <- list) yield f(x)

等同于

list.map(x => f(x))

但是当列表不止一个时,如何使用flatMap并不完全正确。

如果要同时遍历另一个列表,则使用flatMap调用:

for (
  x <- list1
  y <- list2
) yield f(x, y)

这等效于

list1.flatMap(x => list2.map(y => f(x, y)))

map调用被包装在flatMap调用中,因此结果是一个简单列表。如果外部调用为map,则结果将为嵌套列表。

内部调用始终是map调用,所有外部调用都是flatMap。所以

for (
  x <- list1
  y <- list2
  z <- list3
) yield f(x, y, z)

list1.flatMap(x => list2.flatMap(y => list3.map(z => f(x, y, z))))

最后,for最好的用途是对其进行试验,直到它达到您想要的效果为止,一段时间后它将变得直观。