这两种映射函数在scala中有什么区别?

时间:2017-12-07 02:25:31

标签: scala

Scala Koans for Lazy Sequences they have

var x = 0
def inc = {x += 1; x}

val strictList = List(inc _, inc _, inc _)
strictList.map(f => f).head should be(_)

最后一行

strictList.map(f => f).head

返回一个函数。

现在最后一行编译 - 但要实现他们想要的目标,你必须将其修改为:

strictList.map(f => f()).head should be(1)

(即您在第二次引用f后添加了parens。)

会导致这种差异的原因是什么? (假设这不是一个错误)。 Scala语言有变化吗?

我的问题是: scala中这两种映射函数的方法有什么区别?

1 个答案:

答案 0 :(得分:3)

strictList是一个匿名函数列表。在第一种情况下:

strictList.map(f => f).head

你只是映射列表并返回功能。在第二种情况下:

strictList.map(f => f()).head

您实际上正在调用每个匿名函数并构建调用每个函数的结果列表。

您链接的文件中似乎有错误。第19行:

strictList.map(f => f).head should be(3)

不正确。值应该是匿名函数,而不是3