2012-02-23 27 views
19

Lập trình chức năng "tránh trạng thái và dữ liệu có thể thay đổi".Có phải đóng cửa vi phạm mô hình lập trình chức năng không?

Đóng cửa ẩn trạng thái bằng cách gắn kết môi trường từ vựng của chúng và do đó đóng trên các biến số miễn phí.

Haskell hoạt động hoàn toàn như thế nào nếu nó hỗ trợ đóng cửa? Họ không phá vỡ sự minh bạch tham chiếu?

+14

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

+5

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. –

+3

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

Trả lời

21

Trong Haskell, các bao đóng có các biến miễn phí giống như cách tính toán bạn có thể viết f x = x^2 - nó không biến đổi trạng thái.

Tôi có thể nói rằng Haskell tránh trạng thái có thể ẩn.

16

Đó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.

12

Không, đóng cửa là tốt và không gây ra vấn đề trong Haskell vì đóng cửa đóng trên các giá trị của các biến miễn phí. Lý do bạn có thể ẩn trạng thái đằng sau bao đóng bằng các ngôn ngữ khác là bạn đóng trên tham chiếu . Như bạn đã biết, trong Javascript:

var x = 1; 
var f = function(y) { return y + x; } 
f(2) // => 3 
x = 2; 
f(2) // => 4 

Bạn thực sự có thể mô hình này bằng cách sử dụng IORef s trong Haskell:

main = do 
    x <- newIORef 1 
    let f y = do x' <- readIORef x 
       return (y + x') 
    r1 <- f 2 
    writeIORef x 2 
    r2 <- f 2 

Đây là OK, vì chức năng f đã gõ Int -> IO Int hơn Int -> Int. Nói cách khác, f bị ràng buộc với cùng một hành động, nhưng khi được thực thi cùng một hành động có thể trả lại các kết quả khác nhau mỗi lần.

+1

Công việc tuyệt vời. Tôi thường thấy những bình luận về việc đóng cửa là "một yếu tố chính của lập trình chức năng" được đề cập một cách rõ ràng trong các cuộc thảo luận về việc đóng cửa JavaScript. Điều trớ trêu là bạn có thể nhận được nhiều hiệu ứng/lỗi liên quan đến trạng thái khác nhau nếu bạn không cẩn thận với các bao đóng JS vì chúng đang nắm giữ một tham chiếu chứ không phải là một giá trị. Một giải pháp là chuyển giá trị một cách rõ ràng dưới dạng tham số * thay vì * bằng ngữ cảnh đóng (tức là chuyển cả x và y vào làm tham số của hàm f ở trên). Vì vậy, đó thực sự là cách tiếp cận 'chức năng' hơn, đúng không? –

2

Định nghĩa của người đàn ông làm việc của tôi về "lập trình chức năng" là nếu bạn đặt cùng một thứ vào, bạn luôn luôn nhận được cùng một thứ.

Đóng cửa không vi phạm định nghĩa này trong Haskell (cố gắng và đưa ra một đóng cửa có :)), do đó đóng cửa không vi phạm các mô hình FP.

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