2014-11-09 30 views
8

Tôi đã một câu hỏi liên quan đến mô hình này phù hợp trong scala:Pattern Matching Đối số chức năng

val div: (Double, Double) => Double = { 
    case (x, y) if y != 0 => x/y 
} 

Tôi đã hiểu làm thế nào mô hình phù hợp với công trình và syntaxis của nó trong scala, nhưng biểu hiện này làm tôi bực bội. Làm thế nào để complier biết rằng x và y là một đối số của hàm và mẫu khớp với chúng?

Trả lời

9

Quy tắc cho điều này được xác định trong phần 8.5 "Pattern Matching Anonymous Functions" của Đặc tả ngôn ngữ Scala. Nếu sử dụng một hàm ẩn danh với đối sánh mẫu, loại phải được cung cấp một phần. Bạn làm điều đó bằng cách nói loại là (Double, Double) => Double, là viết tắt của Function2[Double, Double, Double].

Bây giờ là:

Nếu loại dự kiến ​​là scala.Function k [S1,…,Sk, R], khái niệm được đưa đến là tương đương với chức năng ẩn danh:

 
(x1:S1,…,xk:Sk) => (x1,…,xk) match { 
    case p1 => b1 … case pn => bn 
} 

Vì vậy, không có vấn đề gì arity chức năng của mình, khớp mẫu được chuyển qua một bộ tham số của hàm, do đó bạn có thể sử dụng cú pháp trình trích xuất tuple thông thường.

Vì vậy, ví dụ của bạn là viết tắt của

val div: (Double, Double) => Double = (a, b) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

hoặc

val div = (a: Double, b: Double) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

Các đặt tên các thông số vắt xy tùy thuộc vào trí tưởng tượng của bạn. Bạn quyết định cách gọi các phần tử kết quả của bộ giải nén, bạn cũng có thể viết case (foo, bar) => ...

Các vấn đề liên quan