tutorial software renault fungicida examples constructora blanquerna scala

software - scala tutorial



Scala: Nil vs List() (3)

En Scala, ¿hay alguna diferencia entre Nil y 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.


Como muestra la respuesta del usuario desconocido, son el mismo objeto.

Idiomáticamente, Nil debería ser preferido porque es bueno y corto. Sin embargo, hay una excepción: si se necesita un tipo explícito por cualquier razón, creo

List[Foo]()

es mejor que

Nil : List[Foo]


ha demostrado que el valor de tiempo de ejecución de Nil y List() es el mismo. Sin embargo, su tipo estático no es:

scala> val x = List() x: List[Nothing] = List() scala> val y = Nil y: scala.collection.immutable.Nil.type = List() scala> def cmpTypes[A, B](a: A, b: B)(implicit ev: A =:= B = null) = if (ev eq null) false else true cmpTypes: [A, B](a: A, b: B)(implicit ev: =:=[A,B])Boolean scala> cmpTypes(x, y) res0: Boolean = false scala> cmpTypes(x, x) res1: Boolean = true scala> cmpTypes(y, y) res2: Boolean = true

Esto es de particular importancia cuando se usa para inferir un tipo, como en un acumulador de pliegue:

scala> List(1, 2, 3).foldLeft(List[Int]())((x, y) => y :: x) res6: 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) ^


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 es más idiomático y puede preferirse en la mayoría de los casos. ¿Preguntas?