2010-08-27 16 views
6
List(1,2) match { 
    case List(1,_) => println("1 in postion 1") 
    case _ => println("default") 
} 

kompiluje/działa dobrze. WięcScala lista mecz

List(1) match ... 
List(3,4,5) match ... 

ale nie

List() match ... 

co prowadzi do następującego błędu

found : Int(1) 
required : Nothing 
      case List(1,_) => println("1 in postion 1") 

Dlaczego List() starają się dopasować listy (1, _)?

Odpowiedz

6

Podczas pisania List(), wywnioskowany typ to Nothing, który jest podtypem do wszystkiego.

To, co się dzieje, to fakt, że Scala popełnia błąd podczas próby dopasowania niemożliwego. Na przykład "abc" match { case 1 => } spowoduje podobny błąd. Podobnie, ponieważ można ustawić statycznie, aby List(1, _) nigdy nie pasowało do List(), Scala podaje błąd.

2

Może dlatego ...

scala> implicitly[List[Nothing] <:< List[Int]] 
res3: <:<[List[Nothing],List[Int]] = <function1> 

scala> implicitly[List[Int] <:< List[Nothing]] 
<console>:6: error: could not find implicit value for parameter e:<:<[List[Int],List[Nothing]] 
     implicitly[List[Int] <:< List[Nothing]] 
+4

Oznacza to, że 'List [Int]' jest zgodny z 'List [Nothing]', ale odwrotnie nie jest to możliwe. – missingfaktor

12

List() ma typ List[Nothing]. Jeśli użyjesz List[Int](), będzie działać tak, jak oczekujesz.

(Ogólnie typy są tak restrykcyjne, jak mogą ewentualnie być;. Od dokonaniu listę w nim nic, najbardziej restrykcyjne-możliwy rodzaj Nothing jest używany zamiast Int jak zamierzony)