Đóng cửa không phải là vi phạm vì tất cả các ràng buộc trong Haskell đều không thay đổi. Những gì đóng thực sự có nghĩa là một lambda với các biến miễn phí không biểu thị một hàm duy nhất; nó sẽ biểu thị các chức năng khác nhau tùy thuộc vào các ràng buộc có hiệu lực cho các biến miễn phí của nó khi mỗi lần nó được đánh giá. Ví dụ .:
makeClosure :: Num a => a -> a -> a
makeClosure x = \y -> x+y
Khái niệm makeClosure 5
để đánh giá một chức năng khác nhau hơn makeClosure 6
; và quan trọng hơn nhiều, hai lần xuất hiện của makeClosure 5
trong các phần khác nhau của chương trình được đánh giá theo cùng chức năng, cũng như makeClosure (2+3)
hoặc tương tự; tức là, chúng tôi có tính minh bạch tham chiếu (thay thế biểu thức bằng các biểu thức bằng cách giữ nguyên ý nghĩa của chương trình).
Bạn dường như bị nhầm lẫn về ý nghĩa của "trạng thái" trong câu nói bạn đề cập. Nhà nước trong bối cảnh này có nghĩa là dữ liệu có thể thay đổi; đóng cửa chắc chắn có thể "ẩn" dữ liệu, nhưng trong Haskell dữ liệu này không phải là mutable, do đó, nó không ẩn nhà nước. Trái ngược với điều này, trong kinh nghiệm của tôi, các lập trình viên Java thường nói rằng một cá thể lớp "ẩn trạng thái" trong trường hợp dữ liệu được đề cập không thể thay đổi được, ví dụ, được gán cho một trường cá thể private final
từ hàm tạo; những gì họ thực sự có nghĩa là các lớp học (và đóng cửa) đóng gói dữ liệu.
Nguồn
2012-02-23 19:36:53
Vì khi nào các biến phá vỡ tính minh bạch tham chiếu? Toán học là như minh bạch tham chiếu như nó được, nhưng những nhà toán học pesky juggle biến tất cả các ngày. – delnan
Việc triển khai có thể liên quan đến nhà nước, nhưng không có bất kỳ đột biến nào diễn ra theo ngữ nghĩa. –
Biến miễn phí trong hàm Haskell có thể là các hàm khác, biểu mẫu áp dụng không đổi hoặc đối số đã áp dụng (ứng dụng một phần), không có gì trong số đó phá vỡ tính minh bạch tham chiếu. – Vitus