Tôi đã có mặt tại hội nghị Ngày của nhà phát triển StackOverflow ngày hôm qua, và một trong những diễn giả đã nói về Python. Ông đã cho thấy một chức năng Memoize, và tôi hỏi nếu có bất kỳ cách nào để giữ cho nó khỏi được sử dụng trên một chức năng không thuần túy. Ông nói không, đó là cơ bản không thể, và nếu ai đó có thể tìm ra một cách để làm điều đó nó sẽ làm cho một luận án tiến sĩ tuyệt vời.Tại sao xác định xem một hàm có khó khăn không?
Đó là loại nhầm lẫn tôi, bởi vì nó không có vẻ như tất cả những gì khó khăn cho một trình biên dịch/thông dịch viên để giải quyết đệ quy. Trong mã giả:
function isPure(functionMetadata): boolean;
begin
result = true;
for each variable in functionMetadata.variablesModified
result = result and variable.isLocalToThisFunction;
for each dependency in functionMetadata.functionsCalled
result = result and isPure(dependency);
end;
Đó là ý tưởng cơ bản. Rõ ràng bạn cần một số loại kiểm tra để ngăn chặn đệ quy vô hạn về các chức năng phụ thuộc lẫn nhau, nhưng đó không phải là quá khó khăn để thiết lập.
Hàm bậc cao có chức năng con trỏ có thể có vấn đề, vì chúng không thể được xác minh tĩnh, nhưng câu hỏi ban đầu của tôi giả định rằng trình biên dịch có một số hạn chế về ngôn ngữ để chỉ định đến một tham số nhất định. Nếu có, có thể được sử dụng để đáp ứng điều kiện. Rõ ràng điều này sẽ dễ dàng hơn trong một ngôn ngữ biên dịch hơn là một giải thích, vì tất cả con số này-crunching sẽ được thực hiện trước khi chương trình được thực hiện và do đó không chậm bất cứ điều gì, nhưng tôi không thực sự thấy bất kỳ vấn đề cơ bản sẽ làm cho nó không thể đánh giá.
Có ai có kiến thức nhiều hơn trong lĩnh vực này biết tôi đang thiếu gì không?
Nó sẽ là bất kỳ biến * truy cập * mà phải là địa phương, không chỉ sửa đổi. Một hàm có kết quả phụ thuộc vào giá trị hiện tại của toàn cầu, ngay cả khi nó không sửa đổi toàn cầu đó, rõ ràng là không thuần túy. – caf
Câu hỏi hiển nhiên: việc ghi chép có ảnh hưởng đến độ tinh khiết không? Tôi sẽ nói rằng ngược lại, thực sự MODIFYING một giá trị toàn cầu (nếu điều này không thể ném), không ảnh hưởng đến kết quả của phương pháp của bạn, và do đó cho phép memoization ngay cả khi nó rõ ràng là không tinh khiết! –