En Scala, ¿hay alguna diferencia entre Nily List()?
Si no, ¿cuál es el estilo de Scala más idiomático? Tanto para crear nuevas listas vacías como para la coincidencia de patrones en listas vacías.
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
Nil es más idiomático y se puede preferir en la mayoría de los casos. Preguntas?
Niles más idiomático.List[A]()(noNil) necesario como valor acumulador para foldLeft? Ejemplo: elscala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)usoNilcomo acumulador aquí no funcionaría.Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)Usuario desconocido ha demostrado que el valor de tiempo de ejecución de ambos
NilyList()son los mismos. Sin embargo, su tipo estático no es:Esto es de particular importancia cuando se usa para inferir un tipo, como en el acumulador de un pliegue:
fuente
y :: xhace el trabajo. El problema es que el tipo que devuelve no es el tipo esperado. RegresaList[Int], mientras que el tipo esperado esList[Nothing]oNil.type(creo que el primero, pero tal vez el último).Como muestra la respuesta del usuario desconocido, son el mismo objeto.
Idiomáticamente, se debe preferir Nil porque es agradable y corto. Sin embargo, hay una excepción: si se necesita un tipo explícito por cualquier razón, creo
es mejor que
fuente
List.empty[Foo]una tercera alternativa.