Trong các ngôn ngữ háo hức như Scheme và Python, bạn có thể sử dụng biểu thức lambda mà không có tham số để trì hoãn đánh giá, ví dụ như trong Scheme (Lược đồ gà):
#;1> (define (make-thunk x) (lambda () (+ x 1)))
#;2> (define t (make-thunk 1))
#;3> (t)
2
Trong dòng 2, t
được liên kết với biểu thức không (lambda () (+ 1 1))
được đánh giá, sau đó được ước tính 2
trong dòng 3.
Tương tự, trong Python:
>>> def make_thunk(x): return lambda: x + 1
...
>>> t = make_thunk(1)
>>> t()
2
Sử dụng kỹ thuật này, người ta có thể thực hiện đánh giá lười biếng trong một ngôn ngữ háo hức.
Vì vậy, tôi đã hy vọng rằng Haskell sẽ không có biểu thức lambda nếu không có tham số vì ngôn ngữ đã lười biếng và không cần phải xây dựng biểu thức bị trì hoãn. Thật ngạc nhiên, tôi phát hiện ra rằng trong Haskell có thể viết biểu thức lambda
\() -> "s"
chỉ có thể được áp dụng cho ()
giá trị như vậy:
(\() -> "s") ()
đưa ra kết quả
"s"
Áp dụng chức năng này cho bất kỳ đối số nào khác ngoài việc ()
ném một ngoại lệ (ít nhất là theo như tôi có thể thấy trong các thử nghiệm của mình). Điều này có vẻ khác với đánh giá chậm trong Scheme và Python, vì biểu thức vẫn cần một đối số để được đánh giá. Vậy biểu thức lambda không có biến (như \() -> "s"
) có nghĩa gì trong Haskell và nó có thể hữu ích cho việc gì?
Ngoài ra, tôi sẽ tò mò muốn biết liệu các biểu thức lambda không tham số tương tự có tồn tại trong (một số loại) lambda-tính toán hay không.
()
ném ngoại lệ ..." Nó có khiến chương trình ném ngoại lệ hay khiến trình biên dịch phàn nàn rằng mã không gõ kiểm tra?