2015-01-07 31 views

Trả lời

13

Trong một số ý nghĩa, sự khác biệt thực sự duy nhất là các biến trong ngôn ngữ mệnh lệnh có thể thay đổi trong khi các tên bị ràng buộc trong các ngôn ngữ chức năng thì không. Nhưng tôi nghĩ rằng điều quan trọng là phải hiểu sự khác biệt ngữ nghĩa cấp cao hơn giữa hai cách và cách chúng tôi suy nghĩ về chúng khác nhau.

Trong ngôn ngữ mệnh lệnh, một biến là một điều tự nó xảy ra bao gồm một giá trị. Chúng thường được so sánh với các hộp chứa thứ gì đó. Nội dung của một hộp có thể thay đổi và, theo ngữ nghĩa, hộp có một bản sắc riêng của nó.

Tên Haskell, mặt khác, chỉ là nhãn cho một giá trị. Bạn có thể sử dụng một hoặc khác hoàn toàn thay thế cho nhau. Quan trọng, họ không thể thay đổi.

So sánh ràng buộc trong Haskell để thực hiện các tên bằng các ngôn ngữ như Java¹. Chúng cũng không thể thay đổi, và bạn không tự nghĩ về chúng; chúng chỉ là tên của phương pháp mà chúng được gắn vào.

Dưới đây là một ví dụ contrived của sự khác biệt: tưởng tượng một hàm f rằng đóng trên một biến mệnh lệnh x:

var x = 7; 
function foo() { 
    console.log(x); 
} 

hiệu quả, x chỉ là một tên cho 7 ... cho đến khi x thay đổi. Những gì bạn đã đóng là biến số x, không phải giá trị của nó là 7, vì vậy nếu thay đổi, hành vi của foo sẽ thay đổi.

Trong Haskell, mặt khác, nếu bạn liên kết 7 với tên x và đóng trên đó, cũng giống như chỉ đóng trên 7.

let x = 7 in \() -> x 

làm điều tương tự như

\() -> 7 

(mà bản thân, không làm bất cứ điều gì nhiều hơn chỉ 7 bởi chính nó, bỏ qua vấn đề nghiêm minh).

¹ bỏ qua phản chiếu và các hình thù tương tự

+0

Giản đồ thường được coi là ngôn ngữ chức năng và các biến của nó có thể thay đổi. – newacct

+0

Ví dụ đóng cửa bắt buộc là một chút tinh tế. Trong một số ngôn ngữ (ví dụ: C++), việc đóng trên 'x' có thể xảy ra theo giá trị (giá trị của' x' được sao chép) hoặc bằng tham chiếu (như trong ví dụ của bạn). Trong trường hợp đầu tiên thay đổi 'x' không ảnh hưởng đến' foo'. – chi

+2

Tôi thường nghĩ về sự khác biệt là "gán giá trị cho biến" (biến có tên 'x', giá trị của bạn bây giờ sẽ là 7) so với "gán tên cho một giá trị" (7, bạn cũng nên gọi là ' x '). – molbdnilo

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