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 ... Cat
và Bird
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ợ andThen
và compose
với chức năng * của arity lớn hơn 1 là gì?
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
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'. –
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