Quando o .empty deve ser usado em relação à instância vazia de singleton?
Trabalhando com coleções no Scala, é comum precisar usar a instância vazia da coleção para um caso base. Como as instâncias vazias padrão estendem a classe de tipo de coleção com um parâmetro de tipoNothing
, às vezes, derrota a inferência de tipo para usá-los diretamente. Por exemplo:
scala> List(1, 2, 3).foldLeft(Nil)((x, y) => x :+ y.toString())
<console>:8: error: type mismatch;
found : List[String]
required: scala.collection.immutable.Nil.type
List(1, 2, 3).foldLeft(Nil)((x, y) => x :+ y.toString())
^
falha, mas as duas correções a seguir são bem-sucedidas:
scala> List(1, 2, 3).foldLeft(Nil: List[String])((x, y) => x :+ y.toString())
res9: List[String] = List(1, 2, 3)
scala> List(1, 2, 3).foldLeft(List.empty[String])((x, y) => x :+ y.toString())
res10: List[String] = List(1, 2, 3)
Outro lugar em que me deparei com um dilema semelhante é na definição de parâmetros padrão. Estes são os únicos exemplos que eu conseguia pensar de cabeça para baixo, mas sei que já vi outros. Um método de fornecer a dica de tipo correta é preferível ao outro em geral? Existem lugares onde cada um seria vantajoso?