Когда я создаю список с помощью foldLeft
, я часто раздражаюсь тем, что я должен явно вводить введенный параметр и хочу, чтобы я мог просто использовать "Nil" вместо этого - здесь надуманный пример:
scala> List(1,2,3).foldLeft(List[Int]())((x,y) => y :: x)
res17: List[Int] = List(3, 2, 1)
scala> List(1,2,3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1,2,3).foldLeft(Nil)((x,y) => y :: x)
Это не так плохо с List[Int]
, но как только вы начнете использовать списки ваших собственных классов, которые почти наверняка будут иметь более длинные имена или даже списки кортежей или других контейнеров, поэтому существует несколько имена классов, которые необходимо указать, это становится ужасным:
list.foldLeft(List.empty[(SomethingClass, SomethingElseClass)]) { (x,y) => y :: x }
Я предполагаю, что причина, по которой он не работает, заключается в том, что если что-то вроде 5 :: Nil
, то компилятор может указать тип пустого списка как List[Int]
, но когда Nil
передается как параметр до foldLeft
у него недостаточно информации для этого, и к тому времени, когда он округляется до использования, его тип установлен. Но... это правда, что это невозможно? Не может ли он вывести тип из возвращаемого типа функции, переданной в качестве второго аргумента?
А если нет, есть ли какая-то более аккуратная идиома, о которой я просто не знаю?