~/bookshelf/programming-in-scala
arrays are always mutable; lists are always immutable.
The telltale sign of a function with side effects is that its result type is Unit.
Tail-call optimization is limited to situations where a method or nested function calls itself directly as its last operation, without going through a function value or some other intermediary.
In principle it's possible to leave out all empty parentheses in Scala function calls. However, it's still recommended to write the empty parentheses when the invoked method represents more than a property of its receiver object. For instance, empty parentheses are appropriate if the method performs I/O, writes reassignable variables (vars), or reads vars other than the receiver's fields, either directly or indirectly by using mutable objects.
if the function you're calling performs an operation, use the parentheses. But if it merely provides access to a property, leave the parentheses off.
When you call a method on a class with mixins, the method in the trait furthest to the right is called first. If that method calls super, it invokes the method in the next trait to its left, and so on.