Многие поклонников Хаскеля отмечают, что ленивость — это одна из самых интересных его особенностей.
Однако и многие его проблемы проистекают из ленивости. Когда данные становятся доступны только когда к ним обращаются вычисления становятся трудно понимаемыми и это противоречит идее побочных эффектов при вычислениях.
А, что если вместо ленивой модели вычислений, в которой доступность данных определяется их необходимостью, применять модель вычислений в которой вычисление определяется доступностью входных данных?
Мы тут делали один DSL для типизации и сделали именно такую модель вычислений. Результат был очень интересным. Язык ведет себя как ленивый, но нет никаких проблем с побочными эффектами, так как вычисления просходят сразу как становятся доступными данные. Общая идея такая:
A = B.C + D; // A зависит от B.C и D, так что эта ветка выполнится последней
B.C = D; // B.C зависит от D, так что эта ветка выполнится второй
D = 42; // D ни от чего не зависит, так что ветка выполнится первой
Большинство свойств такого языка аналогичны "чистому" ленивому ФЯ:
1. Переменные вычисляются один раз.
2. Последовательность вычислений определяется зависимостями.
Однако так как вычисления происходят сразу же как будут доступны зависимости, не возникает проблем с побочными эффектами, отладкой и т.п.
Единственная проблем с его реализацией это создание эффективной машины для его исполнения или преобразования его в эффективный код. Если есть мысли по его эффективной реализации, прошу поделиться (граф зависимостей не предлагать, так как слишком много в памяти нужно держать и менять его на ходу затратно).