1

想知道您是否可以评论为什么以下两种情况的行为不同:

以下作品:

var la= List(12, 13 , 14 ,15);
var func = (x:Int) => println(x)
la.foreach(func)                   // 1
la.foreach(func(_))                // 2

但以下没有:

var la= List(12, 13 , 14 ,15);
var func1 = (x:Int) => {
    for (i <- 0 to x) yield i*2
 } mkString
la.foreach(println(func1))         // similar to 1 above
la.foreach(println(func1(_)))      // similar to 2 above

错误:类型不匹配;发现:所需单位:Int =>?la.foreach(println(func1(_)))

4

2 回答 2

5

此案已脱糖

la.foreach(println(func1(_))) 

la.foreach(println(x => func1(x)))

所以你将函数传递给println,打印返回类型是 Unit 并且 foreach 需要一些Int => ?函数。

相比之下,在这两种情况下您都喂食的第一个样本,而在两种情况下您都喂食foreachInt => Unit第二个foreach样本Unit

于 2012-11-22T19:08:40.907 回答
3

在第二个代码片段中,您println使用一个函数作为其参数进行调用,然后尝试将该调用的结果作为参数传递给foreach. 由于println不返回一个函数,但foreach想要一个,那是行不通的。

于 2012-11-22T19:07:54.197 回答