First four Project Euler in Scala
You should avoid the natural tendency in Scala to make everything a one-liner.  It hinders the readability and maintainability of the code.  I don't think it's much of a problem in the first two, but the third and fourth solutions seem a bit cryptic.  In most cases the compiler will collapse your more verbose collection of defs down to the same result as your one-liner, but the multiple defs are easier to grok for humans.

I can simplify Problem4 with filter and flatten to reduce the lists without resorting to use of '0' as a placeholder for "not to be considered".

println( (100 to 999).map(x=&gt;(x to 999).map(_*x).filter(isPalindrome)).flatten.max)


But it still reads better to me if not so composed.

For example:

  def products = (100 to 999).map(x=&gt;(x to 999).map(_*x)).flatten
  def palProducts = products.filter(isPalindrome)
  println( palProducts.max )


Even that combines too much in products, I think.  For-comprehension can make it more readable even without separate defs:

  def palProducts = 
    for { a &lt;- (100 to 999)
          b &lt;- (  a to 999)
          c = a*b
          if (isPalindrome(c)) } yield c

  println( palProducts.max )


Also, you should add @tailrec annotations to code which is reliant on being tail-recursive, only to prevent them becoming non-tailrec through some accidental change in the future.  This is a minor quibble in these small examples, but it will become more important in larger projects.