Я набрал следующее в ghci, считая, что произойдет одна из двух вещей: 1) интерпретатор зависает, просматривая каждый член бесконечного списка для совпадений с предикатом; или 2) через занавес Haskell jujitsu, интерпретатор каким-то образом выяснит, что последовательность заканчивается на 4 и останавливается там.Конечное понимание бесконечного списка
[x | x <- [1..],5>x]
Результат 1 был тем, что произошло. Теперь, результат 2 был много, чтобы просить. Но так как человек может доказать, что последовательность заканчивается на 4, может ли быть способ заставить интерпретатора сделать это? Может ли это быть переписано таким образом, что оно прекратится? На самом деле существует предикат, который делает конечное понимание из бесконечного списка?
'takeWhile (<5) [1 ..]' – m09
@Mog: Хотя я согласен с вами в вашем комментарии, разве это не обман, так как вы несколько изменили смысл понимания? –
Способность человека доказать что-то о программе - это не всегда автоматическая программа, которую можно имитировать: вы можете понять, что какая-то конкретная программа может закончиться, но в целом это невозможно вычислить (это проблема остановки, которая неразрешима). И вы можете написать любой код, который вы хотите, в понимании списка, поэтому я считаю, что в общем случае у компилятора будет очень сложное время рассуждать о ваших списках. – gfour