Допустим, у нас есть подобная программа:
list = [1..10000000]
main = print $ sum list
Я хочу, чтобы она была скомпилирована таким образом, чтобы исполняемый файл просто печатал 50000005000000, не принимая в качестве много времени и усилий.
В принципе, любое выражение, которое будет гарантированно вычислено, (может быть, здесь поможет анализ строгости), может быть предварительно-вычислено во время компиляции (т.е. мы используем ссылочное-]прозрачность, чтобы сказать, что на самом деле не имеет значения, когда мы вычисляем значение).
Вкратце:«должно быть вычислено» + ссылочная-прозрачность = может быть предварительно-вычислено
Это похоже на запуск программы до тех пор, пока мы не наткнемся на что-то, что зависит от ввода (то есть ядро программы, то, что является общим для всех входных данных, будет предварительно-вычислено )
. Существует ли существующий механизм для достижения этого в настоящее время (в Haskell или любом другом языке)? [Пожалуйста, не указывайте на что-то вроде шаблонов в C++, так как он вообще не имеет ссылочной-прозрачности.]
Если нет, то насколько сложна эта проблема? [Какие сопутствующие технические (и теоретические)проблемы?]