Синтаксис для сопоставления с образцом vararg несколько странный .
def size(s: Shape) : Int = s match{
case Rectangle(x,y) => 1
case Circle(r) => 1
case Location(x,y,shape) => 1
case Group(shapes @ _*) => (0 /: shapes) { _ + size(_) }
}
Обратите внимание, что в последней строке вы суммируете размеры всех подэлементов shapes
, начинающихся с нуля, используя /:
-обращение для фальцов.
Как работает folds : Folds аккумулирует элементы последовательности, используя заданную функцию.
Таким образом, чтобы вычислить сумму списка, мы должны написать (в стиле Хаскеля)
fold (\total element -> total + element) 0 list
, который объединит все элементы списка с заданной функцией сложения, начинающейся с 0 (и, следовательно, вычислит сумму).
В Scala мы можем написать это так:
(0 /: list) { (total, element) => total + element }
, который можно упростить до
(0 /: list) { _ + _ }