Xem xét chức năng này:Trình tối ưu hóa Haskell có sử dụng tính năng ghi nhớ cho các cuộc gọi hàm lặp lại trong phạm vi không?
f as = if length as > 100 then length as else 100
Kể từ khi chức năng là tinh khiết rõ ràng là chiều dài sẽ là như nhau trong cả hai cuộc gọi. Câu hỏi của tôi là trình tối ưu hóa Haskell có thể biến mã ở trên thành tương đương với những điều sau không?
f as =
let l = length as
in if l > 100 then l else 100
Nếu có, thì cài đặt mức nào sẽ bật? Nếu không, thì tại sao? Trong trường hợp này, lãng phí bộ nhớ không thể là lý do được giải thích trong this answer, bởi vì biến được giới thiệu được phát hành ngay sau khi thực hiện hàm xong.
Xin lưu ý rằng đây không phải là bản sao của this question vì phạm vi địa phương và do đó có thể nhận được câu trả lời hoàn toàn khác.
Mặc dù vấn đề này, ghc có thể tích cực hơn nhiều với CSE. Bạn chỉ cần có một ước tính kích thước của giá trị bạn đang CSEing. Một ước tính đơn giản là các loại cơ sở chiếm không gian cẩu thả. – augustss
@augustss Đồng ý. – kosmikus
Làm thế nào là 'chiều dài [1 .. 1000000]> 0' một hoạt động giá rẻ? Sẽ không "chiều dài" phải trở lại trước khi ">" được đánh giá?(Trong ghci, hoạt động bị chậm lại đáng kể khi tôi tăng kích thước của danh sách) –