Em Scala, existe alguma diferença entre Nil
e List()
?
Se não, qual é o estilo Scala mais idiomático? Tanto para criar novas listas vazias quanto para correspondência de padrões em listas vazias.
scala> println (Nil == List())
true
scala> println (Nil eq List())
true
scala> println (Nil equals List())
true
scala> System.identityHashCode(Nil)
374527572
scala> System.identityHashCode(List())
374527572
Nada é mais idiomático e pode ser preferido na maioria dos casos. Questões?
Nil
é mais idiomático.List[A]()
(nãoNil
) como um valor acumulador para foldLeft? Exemplo -scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
UsarNil
como acumulador aqui não funcionaria.Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
Usuário desconhecido mostrou que o valor do tempo de execução de ambos
Nil
eList()
é o mesmo. No entanto, seu tipo estático não é:Isso é de particular importância quando usado para inferir um tipo, como no acumulador de uma dobra:
fonte
y :: x
faz o trabalho. O problema é que o tipo retornado não é o tipo esperado. Ele retornaList[Int]
, enquanto o tipo esperado é umList[Nothing]
ouNil.type
(acho que o primeiro, mas talvez o último).Como mostra a resposta do usuário desconhecido, eles são o mesmo objeto.
Linguisticamente Nil deve ser preferido, porque é agradável e curto. Há uma exceção: se um tipo explícito for necessário por qualquer motivo que eu ache
é melhor do que
fonte
List.empty[Foo]
como uma terceira alternativa.