Использование ссылочной-прозрачности для предварительного-вычисления значений в haskell

Допустим, у нас есть подобная программа:

list = [1..10000000]

main = print $ sum list

Я хочу, чтобы она была скомпилирована таким образом, чтобы исполняемый файл просто печатал 50000005000000, не принимая в качестве много времени и усилий.

В принципе, любое выражение, которое будет гарантированно вычислено, (может быть, здесь поможет анализ строгости), может быть предварительно-вычислено во время компиляции (т.е. мы используем ссылочное-]прозрачность, чтобы сказать, что на самом деле не имеет значения, когда мы вычисляем значение).

Вкратце:«должно быть вычислено» + ссылочная-прозрачность = может быть предварительно-вычислено

Это похоже на запуск программы до тех пор, пока мы не наткнемся на что-то, что зависит от ввода (то есть ядро программы, то, что является общим для всех входных данных, будет предварительно-вычислено )

. Существует ли существующий механизм для достижения этого в настоящее время (в Haskell или любом другом языке)? [Пожалуйста, не указывайте на что-то вроде шаблонов в C++, так как он вообще не имеет ссылочной-прозрачности.]

Если нет, то насколько сложна эта проблема? [Какие сопутствующие технические (и теоретические)проблемы?]

6
задан Karan 10 April 2012 в 19:00
поделиться