Вы можете сделать это только в том случае, если все функции имеют одинаковый тип.
type A = String
type B = String
type C = String
type D = String
val f1: A => B = identity
val f2: B => C = identity
val f3: C => D = identity
val ls: List[String => String] = List(f1, f2, f3)
val aggregate: String => String = ls.reduceLeft(_ andThen _)
aggregate.apply(...)
Это потому, что компилятор Scala выводит тип списка как супертип всех значений в списке, который для функций с одним аргументом равен Nothing => Any
, теперь вы не можете упорядочить список из Nothing => Any
в одну составную функцию, так как конец и начало не совпадают, единственный случай, когда они совпадают, когда аргумент и тип возвращаемого значения совпадают.