Chạy mã này:Tại sao mã này sử dụng tính năng chặn `let` treo?
j = let x = 4
in let x = x * x
in x
trong thông dịch viên:
ghci> j
... no response ...
treo với sử dụng CPU rất ít. Tại sao điều này? Tôi mong đợi j = 16
.
Chạy mã này:Tại sao mã này sử dụng tính năng chặn `let` treo?
j = let x = 4
in let x = x * x
in x
trong thông dịch viên:
ghci> j
... no response ...
treo với sử dụng CPU rất ít. Tại sao điều này? Tôi mong đợi j = 16
.
Theo báo cáo Haskell, section 3.12:
Hãy biểu thức có dạng tổng quát để cho {d1; …; dn} trong e, và giới thiệu một danh sách khai báo theo thứ tự song song, lexically-scoped, lẫn nhau đệ quy (let thường được gọi là letrec trong các ngôn ngữ khác). Phạm vi của các khai báo là biểu thức e và bên phải của các khai báo.
(tôi nhấn mạnh)
Vì vậy, trong lần thứ hai let
, nơi x = x * x
, tất cả x
s tham khảo với cùng ràng buộc, none tham khảo bên ngoài x = 4
ràng buộc.
Đưa ra câu trả lời cho câu hỏi của riêng bạn: tốt đẹp! ^^ –