初心者が最初につまづく基本的なこと

Stringの型と戻り値を明示した厳格な書き方

object HelloWorld {
    def main(args: Array[String]): Unit = {
        val str: String = "Hello!"
        HelloWorld.say(str)
    }

    def say(s: String): Unit =  {
        println(s)
    }


Stringの型と戻り値を省略した書き方

object HelloWorld {
    def main(args: Array[String] {
        val str = "Hello!"
        HelloWorld.say(str)
    }

    def say(s: String) {
        println(s)
    }
} 

コンパイラは構文を解析し、変数の値が文字列なのか、それとも数値なのか自動的に解析してくれます(これを型推論と言う)。
上で挙げた例は、型推論があるおかげでString型の宣言を明示せずに省いても良いという点と、Unitという戻り値を省略すれば、自動的に戻り値がUnitになってくれるということを意味してます。
どちらも動作は同じなのですが初心者からすると、複数のまったく違う文法があることにきづいた瞬間、混乱しちゃいますよね。