Предположим, вы пишете программу, которая ищет в экспоненциально большом или бесконечном пространстве: геймплей, доказательство теорем, оптимизация и т. д., где вы не можете искать во всем пространстве, и качество результатов сильно зависит от выбора его частей для поиска. в пределах имеющихся ресурсов.
В нетерпеливом языке это концептуально просто: язык позволяет указать порядок оценки, и вы используете его, чтобы контролировать, какие части пространства поиска оценивать в первую очередь. (На практике это имеет тенденцию становиться запутанным и сложным, потому что ваш макет кода для управления выводом смешивается с определением проблемы, что является одной из причин, по которой я заинтересован в способах сделать это вместо этого на ленивом языке. Но это концептуально просто.)
В ленивом языке, таком как Haskell, вы не можете сделать это таким образом. Вместо этого я могу придумать два способа сделать это:
Пишите код, который зависит от точного порядка вычислений, который выбран текущей версией используемого вами компилятора, с используемыми вами флагами оптимизации, чтобы все в конечном итоге происходило в правильном порядке. Вероятно, это приведет к проблемам с ремонтопригодностью.
Напишите код, который пишет код, в частности, напишите код, который преобразует определение проблемы вместе с набором эвристик в последовательность инструкций на быстром языке, которая определяет точный порядок, в котором нужно что-то делать. Кажется, это имеет смысл, если вы готовы заплатить авансовые платежи.
Существуют ли другие рекомендуемые способы сделать такого рода вещи?