Tôi có câu hỏi về việc triển khai bộ nhớ đệm (ghi nhớ) sử dụng mảng trong Haskell. Các mô hình sau đây hoạt động:Định nghĩa chức năng Haskell và mảng bộ nhớ đệm
f = (fA !)
where fA = listArray...
Nhưng điều này không (tốc độ của chương trình gợi ý rằng mảng là nhận được tái tạo mỗi cuộc gọi hoặc một cái gì đó):
f n = (fA ! n)
where fA = listArray...
Xác định fA bên ngoài của một mệnh đề where (trong "phạm vi toàn cầu") cũng hoạt động với cả hai mẫu.
Tôi đã hy vọng rằng ai đó có thể chỉ cho tôi hướng tới giải thích kỹ thuật về sự khác biệt giữa hai mẫu trên.
Lưu ý rằng tôi đang sử dụng GHC mới nhất và tôi không chắc liệu đây có phải là tính riêng biệt của trình biên dịch hay một phần của chính ngôn ngữ đó hay không.
EDIT:! được sử dụng để truy cập mảng, vì vậy fA! 5 có nghĩa là fA [5] trong cú pháp C++. Sự hiểu biết của tôi về Haskell là (fA!) N sẽ giống như (fA! N) ... cũng có lẽ thông thường tôi đã viết "f n = fA! N" (không có dấu ngoặc đơn). Dù sao, tôi nhận được cùng một hành vi không có vấn đề làm thế nào tôi ngoặc.
Câu hỏi tương tự đã được đăng tại đây: http://stackoverflow.com/questions/3951012/when-is-memoization-automatic-in-ghc-haskell - mặc dù được nêu rõ hơn một chút và có một số câu trả lời hay. –