2011-10-09 20 views
9

Sự khác biệt giữa các loại của hai chức năng sau đây là gì?Sự khác biệt giữa các loại tương tự đã được xử lý trong Scala

def add1: Int => Int => Int = a => b => a + b 
def add2(a: Int)(b: Int) = a + b 

Dựa trên tuyên bố của họ, chúng dường như có cùng loại. Cả hai đều được gọi theo cách tương tự:

scala> add1(1)(2) 
res2: Int = 3 

scala> add2(1)(2) 
res3: Int = 3 

Tuy nhiên, có một sự khác biệt rõ ràng trong các loại của họ:

scala> :t add1 
Int => Int => Int 

scala> :t add2 
(a: Int)(b: Int)Int 

Bên cạnh đó, ứng dụng một phần của add1 là một chút sạch hơn của add2.

scala> add1(1) 
res4: Int => Int = <function1> 

scala> add2(1)(_) 
res5: Int => Int = <function1> 

Trả lời

1

Chắc chắn có sự khác biệt giữa hai định nghĩa. Cân nhắc chuyển từng đối số.

add1(1) 
(Int) => Int = <function1> 

add2(1) 
<console>:9: error: missing arguments for method add2 in object $iw; 
follow this method with `_' if you want to treat it as a partially applied function 
     add2(1) 

Tuy nhiên, nếu bạn áp dụng một phần add2, nó có cùng loại với add1.

scala> :t add1 
(Int) => (Int) => Int 

scala> :t add2 _ 
(Int) => (Int) => Int 

Tôi hiểu rõ hơn về add1. Đó là một hàm ẩn danh lấy Int và trả về và Int => Int. Đây là định nghĩa cổ điển của một hàm được kết hợp.

Tôi cần đọc nhiều hơn trước khi tôi hiểu rõ hơn về hoàn toàn. Theo như tôi có thể nói, đó là phương pháp viết các hàm lấy thông số của chúng theo một dạng khác (tức là add2(1)(2)) và có thể dễ dàng được chuyển thành hàm được thu thập (add2 _).

Hy vọng điều này sẽ hữu ích! Tôi cũng mong được một lời giải thích tốt hơn về add2.

Edit: đây là một tài liệu tuyệt vời về phương pháp cà ri trong scala: http://www.codecommit.com/blog/scala/function-currying-in-scala

1

x.add1 là một chức năng Int => Int => Int.

x.add2 là một phương pháp, không phải là giá trị và không có cùng loại với add1. Để nhận một đối tượng tương đương với x.add1, bạn phải sử dụng x.add2 _.

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