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: bottom
mở rộng sang chính nó, nauseam quảng cáo. Thuật ngữ bottom
khô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 ignore
khô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.)
a
"?