2013-08-03 35 views
6

Tôi đang đọc «Scala in Depth» của Joshua Suereth, cuốn sách mà tôi đã mua cho năng lực thiết lập rõ ràng của tác giả. Tôi đang ở trang 3 và sau một loạt lỗi chính tả và định dạng không mạch lạc (ok, tôi đã trở nên khoan dung với những lỗi này). Tôi đã tìm hiểu ví dụ sau về cách tiếp cận chức năng để giải quyết một kịch bản rất đơn giản.Scala API 2.10. *: Function2.andSau đó điều gì đã xảy ra?

trait Cat 
trait Bird 
trait Catch 
trait FullTummy 

def catch(hunter: Cat, prey: Bird): Cat with Catch 
def eat(consumer: Cat with Catch): Cat with FullTummy 

val story = (catch _) andThen (eat _) 
story(new Cat, new Bird) 

tôi lấy ví dụ một cách thận trọng miễn là nó rõ ràng là một màu xanh-in (không có phương pháp cụ thể được quy định ...) ... «bắt» rõ ràng là lỗi đánh máy khác được cung cấp đó là một từ dành riêng ... CatBird không instantiable ...

… nhưng, mặc dù chất lượng kém của ví dụ này, tôi không thể xem xét giá trị «câu chuyện» được xác định theo thành phần chức năng (andThen là «đảo ngược liên kết» của compose) là một sai lầm ngẫu nhiên khác. core ví dụ.

Ví dụ hiệu quả sẽ không biên dịch trên phiên bản Scala địa phương của tôi (2.10.1) và nó không được ghi lại trong phiên bản mới nhất hiện có (2.10.2).

Không có nghi ngờ về tính hữu dụng của nó và thực hiện nó rất dễ dàng để thực hiện (tiếp theo):

trait Function2ex[-T1, -T2, +R] extends Function2[T1, T2, R] { 
    def andThen[A](g: R => A): (T1, T2) => A = { (x, y) => g(apply(x, y)) } 
} 

Sau một giám sát ngắn của API tôi thấy rằng các andThen chỉ được hỗ trợ bởi Function1 và được cho là đã biến mất từ Function2 đến Function22 như vậy, câu hỏi là:

Thành ngữ hiện tại để hỗ trợ andThencompose với chức năng * của arity lớn hơn 1 là gì?

Trả lời

5

Tôi không hiểu ví dụ đó ở đâu cả, nhưng đây là một số mã biên dịch trong scala 2.10.2.

trait Cat 
trait Bird 
trait Catch 
trait FullTummy 

def `catch`(hunter: Cat, prey: Bird): Cat with Catch = ??? 
def eat(consumer: Cat with Catch): Cat with FullTummy = ??? 

val story = (`catch` _).tupled andThen (eat _) 
story(new Cat with Catch, new Bird {}) 

Tôi đã báo giá catch vì đó là từ dành riêng và ghi số Function2.

+0

bạn có thể vui lòng giải thích chi tiết về tupled. tại sao bạn phải sử dụng nó (tôi biết rằng nó không hoạt động theo cách khác, nhưng tại sao chúng ta phải tuple nó, vì ăn không chấp nhận tuple chứ không phải là tham số duy nhất "người tiêu dùng")? và những gì nó làm chính xác – igx

+1

Chúng ta phải tuple nó bởi vì '(\' catch \ '_)' là một 'Function2', mà không có một' andThen' phương pháp. Và kiểu trả về ('Cat with Catch') là thứ phải khớp với kiểu đối số' eat'. –

+0

vì vậy chúng tôi thực sự sử dụng tupled để chuyển đổi nó thành Function1 để có được chức năng "andThen", đúng không? – igx