Решено Внедряването на мързеливи функционални езици на haskell
Когато се изпълнява мързелив функционален език, е необходимо да се съхраняват неоценени стойности, които да се оценяват само когато е необходимо.

Едно от предизвикателствата на ефективното изпълнение, както е обсъдено например в La Veule Tagless G-machine, е, че тази оценка трябва да се извърши само веднъж за всяко потапяне, а заявките за „Достъп трябва да използват повторно изчислената стойност - не се прави така би довело до поне квадратично забавяне (може би експоненциално? Не съм сигурен, че това ми е над главата.)
Търся прост пример за изпълнение, което работи лесно (за разлика от индустриалната сила на изпълнение като GHC, която е проектирана за производителност за сметка на простотата). Попаднах на minihaskell на адрес http://www.andrej.com/plzoo/, който съдържа следния код.
Тъй като е наречен „ефективен изпълнител“, предполагам, че на практика всяка оценка се изпълнява само веднъж и се запазва изчислената стойност за повторна употреба, но имам проблеми да видя къде и как? „Или„ Какво; Виждам само едно изявление за присвояване в самия интерпретатор и това не изглежда като презаписване на част от хитър запис.
Така че въпросът ми е, наистина ли това е преводач, който да прави такова кеширане и ако да, къде и как? (И ако не, какво е най-простото съществуващо изпълнение, което прави?)
Отговори
Основните са файловете: avis,! R, r: = v. Всеки път, когато търсим променлива на околната среда, ние връщаме запис, който пренасочваме, за да видим дали е хитрост. Ако е хитрост, ние го оценяваме и след това запазваме резултата. Ние създаваме thunks по време на приложението (обърнете внимание на извикването на ref конструктора), рекурсивни дефиниции и съвпадение на шаблони, защото това са конструкции, които свързват променливи.