2009-06-20 11 views
9

Tôi đang cố gắng hiểu việc triển khai List s trong Scala. Đặc biệt tôi đang cố gắng để có được đầu của tôi xung quanh như thế nào bạn có thể viết các biểu thức kết hợp sử dụng một nhà điều hành ghi, ví dụ:Phân tích đối sánh Scala trên toán tử infix

a match { 
    case Nil => "An empty list" 
    case x :: Nil => "A list without a tail" 
    case x :: xs => "A list with a tail" 
} 

Làm thế nào là biểu hiện trận đấu được phép x :: xs hơn List(x, xs)?

Trả lời

13

Câu trả lời của Jay Conrad gần như đúng. Điều quan trọng là ở đâu đó có một đối tượng có tên :: thực hiện phương thức unapply, trả về loại Option[(A, List[A])]. Thusly:

object :: { 
    def unapply[A](ls: List[A]) = { 
    if (ls.empty) None 
    else Some((ls.head, ls.tail)) 
    } 
} 

// case objects get unapply for free 
case object Nil extends List[Nothing] 

Trong trường hợp của ::List, đối tượng này xảy ra để đi ra khỏi thực tế là :: là một lớp trường hợp này kéo dài List tính trạng. Tuy nhiên, như ví dụ trên cho thấy, nó không là một trường hợp tất cả.

7

Tôi tin rằng :: is actually a class (là một phân lớp của Danh sách), vì vậy, hãy nói x :: xs chủ yếu là tương đương với List(x, xs).

Bạn có thể thực hiện việc này với các lớp vỏ khác có tên toán tử. Ví dụ:

case class %%%(x: Int, y: Int) 

a match { 
    case x %%% y => x + y 
} 
2

Biểu thức đối sánh được phép là x :: xs thay vì Danh sách (x, xs) như thế nào?

Để trả lời câu hỏi này:

Khi xem như một mô hình , một hoạt động ghi vào như p op q tương đương để op (p, q). Đó là, opix của toán tử op được coi là mẫu hàm tạo.

(Lập trình trong Scala, 1st ed., Tr. 331)

Xem thêm scala case classes questions