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 ?

2
  • 2
    See stackoverflow.com/a/1203799/724361 . Commented Sep 4, 2013 at 8: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)(...) Commented Sep 4, 2013 at 9:09

1 Answer 1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.