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

biên dịch/hoạt động tốt. Vì vậy, làmdanh sách đối sánh scala

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

nhưng không

List() match ... 

mà kết quả trong các lỗi sau

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

Tại sao Danh sách() cố gắng để phù hợp với Danh sách (1, _)?

Trả lời

6

Khi bạn viết List(), loại được phỏng đoán là Nothing, là loại phụ cho mọi thứ.

Điều đang xảy ra là Scala đưa ra lỗi khi bạn thử các kết quả không phù hợp. Ví dụ: "abc" match { case 1 => } sẽ dẫn đến lỗi tương tự. Tương tự, vì List(1, _) có thể được xác định tĩnh để không bao giờ khớp với List(), Scala đưa ra lỗi.

2

Có lẽ bởi vì ...

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

Điều này có nghĩa là 'Danh sách [Int]' có thể cưỡng chế thành 'Liệt kê [Không có gì]' nhưng không thể thực hiện theo cách khác. – missingfaktor

12

List() có kiểu List[Nothing]. Nếu bạn sử dụng List[Int](), nó sẽ hoạt động như bạn mong đợi.

(Nói chung, các loại như hạn chế khi họ có thể có thể được;. Kể từ khi bạn đã thực hiện một danh sách không có gì trong đó, mức cao nhất-hạn chế-thể loại Nothing được sử dụng thay vì Int như bạn dự định)