scala flatMap сглаживает вложенные списки

Я изучаю Scala и решаю 99 проблем Scala. Для следующих упражнений:

Выравнивание структуры вложенного списка. Пример:

scala> flatten(List(List(1, 1), 2, List(3, List(5, 8))))
res0: List[Any] = List(1, 1, 2, 3, 5, 8)

Решение дается как

def flatten(ls: List[Any]): List[Any] = ls flatMap {
  case ms: List[_] => flatten(ms)
  case elements => List(elements)
}

Но мне было интересно, почему следующее не работает?

def flatten[A](ls: List[List[A]]): List[A] = ls flatMap {
  case ms: List[_] => flatten(ms)
  case elements => List(elements)
}

IntelJ IDEA сообщает мне, что проблема связана с частью flatten(ms), в которой говорится, что «невозможно разрешить сглаживание ссылок с такой подписью», а в документации класса List для flatten говорится: «Примечание: компилятор может быть не в состоянии определить параметр типа».

Есть идеи, почему второй код не работает?


person Runner Bean    schedule 25.05.2016    source источник


Ответы (2)


У кого-то был другой вопрос, но на том же примере.

Я разбиваю каждый шаг и объясняю его здесь

person Rhys Bradbury    schedule 25.05.2016
comment
Да что кто-то другой был я! И я принял ваш отличный подробный информативный ответ, так что спасибо. Но я чувствую, что это другое, и в том ответе не было объяснено (я не просил, чтобы это объяснялось там). Здесь я спрашиваю, почему мы не можем использовать [A], чтобы сказать, что это может быть тип int или char или что-то еще. Синтаксис [A] используется во всех остальных первых десяти вопросах по 99 задачам scala, и когда я проверяю себя, мне трудно остановить себя, используя [A] для этого примера, но мне нужно, поскольку это неправильно. Но если бы я знал, почему это неправильно, я мог бы обнаружить, что не пытаться использовать [A] кажется более естественным. - person Runner Bean; 26.05.2016

Потому что последний шаг распаковки не удастся? У вас будет List(elements), а вторая версия flatten требует предоставления List в List.

person michaJlS    schedule 25.05.2016