2011-11-29 28 views
6

Sự khác biệt giữa những điều này là gì? Tôi biết rằng chữ ký của họ khác nhau và tất cả các chức năng đều bắt đầu bình thường và phải là .tupled để lấy biểu mẫu của họ. Lợi thế của việc sử dụng các chức năng chưa được đánh dấu (nhưng không bị quấy rầy) là gì? Đặc biệt là bởi vì có vẻ như với tôi rằng việc chuyển nhiều đối số đến một hàm đã được tự động hóa sẽ tự động giải nén chúng, do đó, tất cả các lần xuất hiện đều giống nhau.Scala: các chức năng bình thường so với các hàm tupled?

Một khác biệt tôi thấy là nó buộc bạn phải có các loại cho mỗi số lập luận chức năng: Function0, Function1, Function2, Function3 vv, trong khi chức năng tupled là tất cả chỉ là Function1[A, R], nhưng điều đó có vẻ như một nhược điểm. Lợi thế lớn của việc sử dụng các chức năng không được kích hoạt là gì?

Trả lời

7

Các hàm được yêu cầu yêu cầu đối tượng tuple được tạo khi chúng được gọi (trừ khi các đối số xảy ra đã được đóng gói thành một bộ). Các hàm không được phân tách đơn giản chỉ định nghĩa một phương thức nhận số đối số thích hợp. Do đó, với kiến ​​trúc JVM, các hàm không được tupled có hiệu quả hơn.

3

Hãy xem xét ví dụ sau:

scala> def mult = (x: Int, y: Int) => x * y 
mult: (Int, Int) => Int 

scala> val list = List(1, 2, 3) 
list: List[Int] = List(1, 2, 3) 

scala> list zip list map mult 
<console>:10: error: type mismatch; 
found : (Int, Int) => Int 
required: ((Int, Int)) => ? 
       list zip list map mult 
           ^

scala> list zip list map mult.tupled 
res4: List[Int] = List(1, 4, 9) 

Có rất nhiều tình huống mà bạn kết thúc cặp yếu tố trong các bộ. Trong những tình huống như vậy, bạn cần có một hàm tupled để xử lý nó. Nhưng có rất nhiều địa điểm khác, nơi đó là không phải là đúng! Ví dụ:

scala> list.foldLeft(1)(mult) 
res5: Int = 6 

scala> list.foldLeft(1)(mult.tupled) 
<console>:10: error: type mismatch; 
found : ((Int, Int)) => Int 
required: (Int, Int) => Int 
       list.foldLeft(1)(mult.tupled) 
            ^

Vì vậy, về cơ bản, Scala có một sự phân đôi giữa các bộ và các thông số, có nghĩa là bạn phải chuyển đổi chức năng từ tupled để untupled và ngược lại ở đây và ở đó.

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