В отличие от C# (и Java и C и C++), которые являются языками на основе инструкций, Scala является языком, основанным на выражениях. Это в основном большой плюс с точки зрения композитоспособности и удобочитаемости, но в этом случае разница укусила вас.
Способ Scala неявно возвращает значение последнего выражения в методе
scala> def id(x : String) = x
id: (x: String)String
scala> id("hello")
res0: String = hello
В Scala в значительной степени все это выражение. Вещи, которые выглядят как заявления, по-прежнему являются выражениями, возвращающими значение типа Unit. Значение может быть записано как().
scala> def foo() = while(false){}
foo:()Unit
scala> if (foo() ==()) "yes!" else "no"
res2: java.lang.String = yes!
Нет компилятор для Тьюринг-эквивалентного языка может обнаружить все не оконечные петли (c.f. Тьюринга проблемы остановки), так что большинство компиляторов делает очень мало работу для обнаружения любого. В этом случае тип «while (someCondition) {...}» - это единица, независимо от того, что такое someCondition, даже если это константа true.
scala> def forever() = while(true){}
forever:()Unit
Scala определяет, что заявленный тип возвращаемого (String) не совместим с фактическим типом возвращаемого (Unit), который является типом последнего выражения (в то время как ...)
scala> def wtf() : String = while(true){}
<console>:5: error: type mismatch;
found : Unit
required: String
def wtf() : String = while(true){}
Ответ: добавить исключение в конце
scala> def wtfOk() : String = {
| while(true){}
| error("seriously, wtf? how did I get here?")
| }
wtfOk:()String
FWIW - есть [ множество способов реализации логики повторов в целом] (http://stackoverflow.com/q/7930814/115478). – leedm777
+1 Благодарим вас за советы и дополнительную информацию о подводных ловушках. –