1
votes

Wondering if you can comment on why following two scenarios behave differently:

The following works:

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

But the following does not:

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

error: type mismatch; found : Unit required: Int => ? la.foreach(println(func1(_)))

2
tightest non-degenerate scope : see my comment at stackoverflow.com/a/5259946/562716Peter Schmitz

2 Answers

5
votes

This case is desugared

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

to

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

So you passing the function to println, print return type is Unit and foreach requires some Int => ? function.

In contrasting, the first sample in both cases you are feeding foreach with Int => Unit, while in the 2nd sample in both cases you are feeding foreach with Unit.

3
votes

In the second code snippet, you're calling println with a function as its argument and then trying to pass the result of that call as an argument to foreach. Since println does not return a function, but foreach wants one, that does not work.