Có phải các phương thức xích chỉ yêu cầu một tham số cho mỗi phương thức tương đương với currying?


15

Gần đây tôi đã chơi đùa với Ruby và tôi thấy mình tự hỏi liệu trong các ngôn ngữ hướng đối tượng thuần túy (và ngay cả những ngôn ngữ không thuần túy) tạo ra các phương thức chỉ có một tham số và sau đó bị xiềng xích lại với nhau có tương đương với việc sử dụng các ngôn ngữ có chức năng không Phong cách? Nếu không, tai sao không? Tôi đánh giá cao một câu trả lời chi tiết, thậm chí nghiêm ngặt về chủ đề này.

Câu trả lời:


14

Phương pháp xâu chuỗi trong các ngôn ngữ hướng đối tượng là một chút khác biệt với cà ri. Theo định nghĩa , kết quả của cà ri là một hình thức hạn chế hơn của chức năng ban đầu . Theo quy ước , kết quả của chuỗi phương thức là một dạng sửa đổi của đối tượng ban đầu (thường không phải là hàm) . Phương thức xâu chuỗi phương thức có thể được sử dụng với các phương thức không liên quan trên cùng một lớp, trong khi việc xáo trộn liên quan đến việc trả về một hàm trong đó một hoặc nhiều tham số của hàm ban đầu được cố định (được xác định trước).

Trong Java, chuỗi phương thức giống như:

String myString = new StringBuilder("Hi ").append(firstName)
                                          .append(" ")
                                          .append(lastName)
                                          .append("!")
                                          .toString();

Vì vậy, mỗi lệnh gọi phương thức .append () trả về một con trỏ tới đối tượng StringBuilder ẩn danh. Đối tượng này hoàn thành sau mỗi .append () và nó không phải là một hàm.

Ngược lại, trong Scala, ứng dụng một phần hoặc cà ri giống như:

def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14

(Mẫu lấy từ blog của Daniel Yankowsky )

simpler()trong ví dụ này là một hàm bao bọc cho simple(). simpler()vẫn là một hàm lấy nhiều tham số hơn trước khi có thể đánh giá bất cứ thứ gì ngoại trừ phiên bản giới hạn hơn của chính nó.

EDIT: Đọc cái này một ngày sau, tôi nghĩ "hàm bao bọc" là chìa khóa. Ứng dụng Currying hoặc một phần tốt nhất có thể được mô phỏng trong Java bằng các phương thức trình bao bọc.

public interface Simpler {
    public int apply(int y, int z);
}

public class Simple {
    public int apply(int x, int y, int z) { return x * (y + z); }

    public Simpler partiallyApply(final int x) {
        final simple = this;
        return new Simpler() {
            @Override
            public int apply(int y, int z) {
                // x is the final int parameter to partiallyApply()
                simple.apply(x, y, z);
            }
        }
    }
}

: KẾT THÚC

Phương thức xâu chuỗi có thể tương tự như ứng dụng một phần hoặc currying, nhưng nó chỉ có thể tương đương với các phương thức trả về các phương thức khác (tra cứu Functor), và sau đó các phương thức cần được thiết lập với các kiểu trả về có ý nghĩa mô hình hóa currying hoặc ứng dụng một phần.

Phương thức xâu chuỗi thường được sử dụng để thực hiện một cái gì đó như đánh giá lười biếng, như được thực hiện với mẫu thiết kế "Builder" và các giao diện Thư viện bộ sưu tập mới trong Java 8 .

Tôi hy vọng điều đó sẽ giúp.


+1: Tôi biết điều đó, nhưng tôi không nghĩ rằng tôi có thể nói rõ nó ở bất cứ đâu gần như bạn đã làm.
Peter Rowell

Giải thích rõ ràng, đây là một dấu kiểm màu xanh lá cây và một upvote cho rắc rối của bạn.
Kỹ sư thế giới

Câu hỏi về ví dụ rất hay của StringBuilder - không có toString()cuộc gọi, liệu chúng ta không sao chép hiệu quả ý định của curry trong cuộc gọi của mình? Tôi chỉ đang cố gắng để có được khái niệm cà ri trong OO.
Sridhar Sarnobat

1
@ Sridhar-Sarnobat một hàm được trả về một hàm khác có ít tham số hơn. Các tham số bị loại bỏ được biến thành hằng số nội bộ trong hàm trả về. Một số đối tượng được xử lý như các hàm trong Java 8, có thể làm cho điều này trở nên khó hiểu, nhưng StringBuilder không phải là một trong số chúng. Hmm, trong StringBuilder, append(charSeq)hàm là một dạng insert(destOffset, charSeq)hàm của hàm destOffsetluôn có độ dài của StringBuilder.
GlenPeterson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.