Scala: Nil vs List ()

En Scala, y a-t-il une différence entre Nil et List() ?

Sinon, lequel est le plus idiomatique? Tant pour la création de nouvelles listes vides que pour la correspondance de modèles sur des listes vides.

 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 est plus idiomatique et peut être préféré dans la plupart des cas. Des questions?

L’utilisateur inconnu a montré que la valeur d’exécution de Nil et de List() est la même. Cependant, leur type statique n’est pas:

 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 

Ceci est particulièrement important lorsqu’il est utilisé pour déduire un type, comme dans l’accumulateur d’un pli:

 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) :10: error: type mismatch; found : List[Int] required: scala.collection.immutable.Nil.type List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x) ^ 

Comme l’indique la réponse de l’utilisateur inconnu, il s’agit du même object.

Idiomatiquement Nil devrait être préféré car il est beau et court. Il y a cependant une exception: si un type explicite est nécessaire pour une raison quelconque, je pense

 List[Foo]() 

est plus beau que

 Nil : List[Foo]