Below are my answers for SftI Chapter 2. I've also included some commentary on interesting things I realized as I did the problems.

1. def signum(n: Int) = { if (n == 0) 0 else if (n > 0) 1 else -1 }




2. No value.  Unit.




3. def x = y = 1.

This is equivalent to:

def x = { y = 1 }

Look at the example function on page 20 to understand why. Appreciate that functions can have a signature of n parameters, zero parameters, or _no_parameters. It's that last form that Scala is exploiting here. The third example in the section on laziness on page 24 provides the other half of the hint.

4. for(i <- 10.to(0, -1)) println(i)

I guessed the syntax for the step parameter. It's nice to know Scala's at least as useful as Perl.

5. def countdown(n: Int) { for(i <- n.to(0, -1)) println(i) }

Note that there's no equals sign. This function is pure side effect.

6. def unimath(s: String) { var x = 1 ; for (i <- s) { x = x * i }; println(x); }




7. def unimath2(s: String) { println(s.foldLeft(1)((b, a) => b*a)) }

It's important to know that I have no idea what that arrow operator is there; I looked up the syntax for foldLeft on line, after recognizing it from Javascript's ubiquitous underscore library, of all things. It looks like a lambda expression. The book doesn't help, but the cheatsheetdoes say this is used for anonymous functions. There is no #8. I didn't realize I wasn't supposed to do #6 and #7 as literals rather than functions. Sorry, competence is a habit.

def unimath3(s: String) {
  def unimathhelper(s: String, i: Int):Int = {
    if (s.length == 0) i else unimathhelper(s.tail, i * s.head)
  }
  println(unimathhelper(s, 1))
}

This one is cool for all sorts of reasons. Not only does it do a lovely recursion, but I love that the whole head/tail thing is there, and I am especially happy to see that nested functions work in Scala, since it looks like one of those languages that ought to have it.

def powers(x: Double, n: Int):Double = {
  if (n == 0) 1 else
    {
      if (n < 0) (1 / powers(x, (-1 * n))) else
        {
          if ((n % 2) == 0) {
            val y = powers(x, n / 2)
            y * y
          } else {
            x * powers(x, n - 1)
          }
        }
    }
}

I'm a little annoyed by this one because it's arbitrary: the definition in the book doesn't tell you what you're looking for, or why. That said, it was a fairly easy, if annoying, cascade of if statements.  And hey, it's entirely made of immutable expressions.  I like that.