IterableOnce.fold
определяется с использованием нескольких списков параметров возможно из-за причин вывода типа, как это было предложено Йоргом Миттагом
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1
с другой стороны, например, Either.fold
определяется с использованием одного списка параметров
def fold[C](fa: A => C, fb: B => C): C
Подтверждение причин вывода типа, рассмотрим следующий пример
def zar[T](x: T)(f: (T, T) => T) = f(x, x)
def tar[T](x: T, f: (T, T) => T) = f(x, x)
zar(21)(_ + _) // OK
tar(21, _ + _) // Error: missing parameter type for expanded function
tar[Int](21, _ + _) // OK
Обратите внимание, что мы имели явно указывать параметр типа на tar
, если не используются несколько списков параметров.