Мой опыт работы со Scala заключается в том, что есть несколько способов сделать что-то, но относительно немного «лучших» способов сделать что-то. В библиотеке очень мало бесплатных опций для разных вещей; когда это происходит, обычно в некоторых случаях включается дополнительная выразительность, компактность или эффективность.
Например, если вы хотите суммировать массив целых чисел, вы могли бы быть полностью процедурным, который генерировал бы код, который был бы максимально быстрым, за счет того, что он был немного неуклюжим - но если это действительно время - критический код, это единственный лучший способ решить проблему:
val array = Array(1,2,3,4,5)
var sum = 0
var index = 0
while (index < array.length) {
sum += array(index)
index += 1
}
sum
Существуют также общие функциональные подходы, которые работают медленнее при работе с примитивами (это может измениться с @ special в 2.8), но оставят вам меньше утомительного:
var sum = 0
Array(1,2,3,4,5).foreach(x => sum += x)
sum
И еще есть несколько менее общие функциональные конструкции, предназначенные именно для такого рода проблем (поскольку они часто возникают), и это "лучше", если вы хотите чистый, компактный код:
Array(1,2,3,4,5).reduceLeft( _ + _ )
И иногда есть очень не общие конструкции, которые делают именно то, что вы хотите; в Scala 2.8, например:
Array(1,2,3,4,5).sum
Таким образом, вы получаете непрерывный выбор с компромиссами в общей мощности, компактности, четкости и скорости. Если вы можете предположить, что код должен быть доступен только людям, хорошо знакомым со Scala, и знаете, нужна ли вам максимально возможная производительность или нет, то хороший выбор, как правило, довольно ограничен. Но из-за выразительной силы языка и библиотеки, как правило, существует множество возможных, если не оптимальных, способов сделать что-либо.