Thử nghiệm về giá trị / ngữ nghĩa tham khảo của Haskell


8

Trong các ngôn ngữ bắt buộc, việc đưa ra một bài kiểm tra lập trình về việc sử dụng "ngữ nghĩa giá trị" hoặc "ngữ nghĩa tham chiếu" là chuyện nhỏ. Người ta có thể làm như sau và kiểm tra giá trị của a(ở đâu Vertex {one, two, three :: Integer}):

a := Vertex 3 4 5
b := a
one b   :=  6
two b   :=  8
three b := 10

Tuy nhiên, vì các biến là bất biến trong các ngôn ngữ chức năng, thử nghiệm này sẽ không hoạt động trong các ngôn ngữ như vậy.

Tôi biết rất ít về Haskell (và lập trình chức năng nói chung), nhưng sự hiểu biết của tôi là nó sử dụng ngữ nghĩa giá trị. Có thể đưa ra một thử nghiệm lập trình phân biệt giữa "bản ghi ref" và "bản ghi val" trong Haskell không?


1
Trong câu thứ hai, bạn có nghĩa là "kiểm tra giá trị của a"?

1
jk.

Haskell là minh bạch tham chiếu , [1] có nghĩa là 'ngữ nghĩa giá trị' và 'ngữ nghĩa tham chiếu' là tương đương trong Haskell. [1] Các chuyên viên máy tính lập trình ngôn ngữ sẽ có một cuộc tranh luận dài về tuyên bố đó, nhưng nó khá truyền thống để sử dụng nó theo nghĩa tôi vừa làm.
Jonathan Cast

Câu trả lời:


9

Không có thử nghiệm nào như vậy, bởi vì, nếu không có tính đột biến, sự khác biệt không có ý nghĩa (như bạn đã chứng minh).


3
Điều đáng chú ý là một số phần của Haskell ( IORef, MVarv.v.) có thể thay đổi và hoạt động như tài liệu tham khảo ( hpaste.org/81192 )
Daniel Gratzer

9

Haskell không có tài liệu tham khảo (tài liệu tham khảo là một đối tượng có thể thay đổi và Haskell không có các đối tượng có thể thay đổi (có thể truy cập trực tiếp). Do đó, các hàm gọi sử dụng ngữ nghĩa giá trị, loại theo mặc định. Thực tế đây là một thuộc tính quan trọng của các ngôn ngữ chức năng thuần túy: một hàm không thể sửa đổi đối số của nó.

Giá trị ngữ nghĩa không ngụ ý rằng sao chép xảy ra dưới mui xe. Bạn chỉ cần sao chép một phần của giá trị mà hàm sửa đổi, trong ngôn ngữ thuần túy có nghĩa là bạn không bao giờ cần sao chép bất cứ thứ gì.

Tuy nhiên, đây không phải là toàn bộ câu chuyện. Theo một nghĩa nào đó, Haskell có ngữ nghĩa tham khảo.

Mặc dù việc kiểm tra xem một hàm có sửa đổi đối số của nó hay không là vô nghĩa, nhưng bạn có thể kiểm tra xem một hàm có sử dụng (một phần) đối số của nó không. Cung cấp cho nó một đối số không chấm dứt. Nếu cuộc gọi hàm kết thúc, bạn biết hàm không sử dụng đối số của nó.

let bottom = bottom
let ignore x = 1
ignore bottom

Nếu bạn đánh giá bottom, nó không chấm dứt: bottommở rộng sang chính nó, nauseam quảng cáo. Thuật ngữ bottomkhông thể có một giá trị. Nhưng nếu bạn đánh giá ignore bottom, giá trị là 1. Điều này cho thấy việc gọi hàm ignorekhông yêu cầu tính giá trị của đối số của nó. Theo nghĩa này, Haskell có một ngữ nghĩa tham chiếu: những gì một hàm nhận được không phải là một giá trị mà là thứ cho phép tìm thấy giá trị này. Thuật ngữ kỹ thuật là gọi theo tên (trái ngược với gọi theo giá trị ).

(Chính xác hơn, việc triển khai Haskell sử dụng lệnh gọi theo nhu cầu . Trong cuộc gọi theo giá trị, đối số của hàm được đánh giá chính xác một lần, ngay trước khi gọi hàm. Trong cuộc gọi theo tên, đối số được đánh giá mỗi lần nó được sử dụng, có thể phạm vi từ không bao giờ đến nhiều lần như hàm muốn. Trong cuộc gọi theo nhu cầu, đối số được đánh giá nhiều nhất một lần: nó được đánh giá lần đầu tiên được sử dụng hoặc không bao giờ nếu nó không được sử dụng.)


2
Tất nhiên, một lần nữa, trong một ngôn ngữ thuần túy gọi theo nhu cầu và gọi bằng tên là không thể phân biệt. Gọi theo nhu cầu sau đó đơn giản trở thành một chiến lược tối ưu hóa.
Jörg W Mittag

2
@ JörgWMittag Điểm tốt, tôi quên đề cập đến điều đó. (Bằng cách này, để nitpick, gọi theo nhu cầu không phải lúc nào cũng hiệu quả hơn gọi bằng tên khi hoạt động trong bộ nhớ hữu hạn.)
Gilles 'Somali dừng vốn là xấu'

1
Vâng, nhưng ai chỉ có bộ nhớ hữu hạn? Tất cả chúng ta đều đang sử dụng Turing Machines, phải không? Nghiêm túc: Tôi cho rằng đó là bởi vì bạn có một sổ sách kế toán nhất định liên quan đến việc bạn có "cần" giá trị hay không, phải không? Ví dụ thunks hoặc một cái gì đó như thế?
Jörg W Mittag

3
@ JörgWMittag Nhưng ngay cả trong một máy Turing, bộ nhớ là một hạn chế ở chỗ nếu bạn giữ nhiều thứ xung quanh, để đạt được những thứ hữu ích đòi hỏi nhiều hơn về băng từ. Trên máy tính thật, điều này được gọi là cục bộ bộ nhớ cache kém.
Gilles 'SO- ngừng trở nên xấu xa'

7

Không thể phân biệt giữa chúng. Điều này có nghĩa là trình biên dịch có thể tự do lựa chọn sử dụng bất kỳ ngữ nghĩa nào mà nó thấy phù hợp để có hiệu suất tối ưu.

Cụ thể, các ngôn ngữ chức năng thường được mô tả là có ngữ nghĩa giá trị, bởi vì nó phù hợp với mô hình khái niệm của chúng về chúng, nhưng chúng thường được triển khai bằng cách sử dụng ngữ nghĩa tham chiếu vì điều đó hiệu quả hơn. (Không cần phải sao chép thứ gì đó không thể thay đổi!)

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.