6

I am playing around with code examples related to Scala in Action book http://www.manning.com/raychaudhuri/

Quoting from https://github.com/nraychaudhuri/scalainaction/blob/master/chap01/LoopTill.scala

// Run with >scala LoopTill.scala  or
// run with the REPL in chap01/ via
// scala> :load LoopTill.scala

object LoopTillExample extends App {
  def loopTill(cond: => Boolean)(body: => Unit): Unit = {
    if (cond) { 
      body
      loopTill(cond)(body)     
    }
  }

  var i = 10   
  loopTill (i > 0) {     
     println(i)
     i -= 1   
  }   
}

In above code cond: => Boolean is where I am confused. When I changed it to cond:() => Boolean it failed.

Could someone explain me what is the different between

cond: => Boolean 

and

cond:() => Boolean 

Aren't they both represent params for function ?

1esha
  • 1,722
  • 11
  • 17
nish1013
  • 3,658
  • 8
  • 33
  • 46
  • 2
    See http://stackoverflow.com/a/1203799/724361 . – mikołak Sep 04 '13 at 08:22
  • 1
    They are essentially the same. Both of them compile to Function0[Boolean]. The only difference is that call-by-name (cond: => Boolean) is a bit shorter since you don't need to write loopTill(() => i > 0)(...) – ZhekaKozlov Sep 04 '13 at 09:09

1 Answers1

7

I'm by no means a scala expert, so take my answer with a heavy grain of salt.

The first one, cond: => Boolean, is a by-name parameter. To keep things simple, it's essentially syntactic sugar for a function of arity 0 - it's a function, but you handle it as a variable.

The second one, cond: () => Boolean, is an explicit function parameter - when you reference it without adding parameters, you're not actually calling the function, you're referencing it. In your code, if(cond) can't work: a function cannot be used as a boolean. It's return value can be, of course, which is why you need to explicitely evaluate it (if(cond())).

There's a wealth of documentation about by-name parameters, a very powerful feature in Scala, but as far as I understand it, it can just be considered syntactic sugar.

Nicolas Rinaudo
  • 6,068
  • 28
  • 41