2012-03-13 12 views

Respuesta

30

En primer lugar, new List() no funcionará, ya que la clase List es abstracta. Las otras dos opciones se definen de la siguiente manera en the List object:

override def empty[A]: List[A] = Nil 
override def apply[A](xs: A*): List[A] = xs.toList 

es decir, que son esencialmente equivalentes, por lo que es sobre todo una cuestión de estilo. Prefiero usar empty porque me parece más claro y se reduce entre paréntesis.

12

A partir del código fuente de List tenemos:

object List extends SeqFactory[List] { 
    ... 
    override def empty[A]: List[A] = Nil 
    override def apply[A](xs: A*): List[A] = xs.toList 
    ... 
} 

case object Nil extends List[Nothing] {...} 

para que podamos ver que es exactamente el mismo

Para completar, también se puede utilizar Nil.

4

Para las creaciones de una lista vacía, como han dicho otros, puede usar la que le parezca mejor.

Sin embargo, para la coincidencia de patrones en contra de una lista vacía, sólo se puede utilizar Cero

scala> List() 
res1: List[Nothing] = List() 

scala> res1 match { 
    | case Nil => "empty" 
    | case head::_ => "head is " + head 
    | } 
res2: java.lang.String = empty 

EDITAR: Corrección: case List() también funciona, pero no se compila case List.empty

Cuestiones relacionadas