Tôi có một hàm lấy tham số và tạo kết quả. Thật không may, phải mất khá nhiều thời gian để hàm tạo ra kết quả. Hàm này được gọi khá thường xuyên với cùng một đầu vào, đó là lý do tại sao nó sẽ thuận tiện nếu tôi có thể lưu trữ kết quả. Một cái gì đó nhưKết quả bộ nhớ đệm Haskell của hàm
let cachedFunction = createCache slowFunction
in (cachedFunction 3.1) + (cachedFunction 4.2) + (cachedFunction 3.1)
Tôi đã xem xét Data.Array và mặc dù mảng là lười, tôi cần phải khởi tạo nó với một danh sách các cặp (sử dụng listArray) - đó là không thực tế. Nếu 'khóa' là ví dụ: kiểu 'Double', tôi không thể khởi tạo nó, và thậm chí nếu tôi có thể gán một Integer cho mọi đầu vào có thể, tôi có vài chục nghìn đầu vào có thể và tôi chỉ sử dụng một số ít. Tôi sẽ cần phải khởi tạo các mảng (hoặc, tốt nhất là một bảng băm, như là chỉ một số ít các resutls sẽ được sử dụng) bằng cách sử dụng một chức năng thay vì một danh sách.
Cập nhật: Tôi đang đọc các bài viết ghi nhớ và theo như tôi hiểu thì MemoTrie có thể hoạt động theo cách tôi muốn. Có lẽ. Ai đó có thể thử tạo ra 'cachedFunction'? Ưu tiên cho một hàm chậm có 2 đối số đôi? Hoặc, cách khác, phải mất một đối số Int trong một miền của ~ [0,1 tỷ] mà sẽ không ăn tất cả bộ nhớ?
1 cho memoization – Macke
Tên miền chính là khoảng 1,8 tỷ. Tôi không có cách nào để _initialize_ bất kỳ cấu trúc dữ liệu như thế này sẽ ăn tất cả bộ nhớ có sẵn của tôi. – ondra
Đó là lý do tại sao ý tưởng là * khởi tạo lười biếng *; về mặt lý thuyết cấu trúc dữ liệu chứa toàn bộ không gian chính, nhưng việc đánh giá không nghiêm ngặt chỉ cho phép các phần bạn thực sự sử dụng để khởi tạo. Đó là ý tưởng tương tự như danh sách vô hạn, ngoại trừ việc bạn sẽ cần một cái gì đó tránh được sự truyền tải tuyến tính. –