В Haskell я могу написать самореляционную последовательность в GHCI, например:
λ> let x = 1:map (+1) x
λ> take 5 x
который производит:
[1,2,3,4,5]
Однако моя интуиция относительно ленивой оценки говорит, что это должно произойти во время расширения
let x = 1:map (+1) x
1:2:map (+1) x
1:2:map (+1) [1, 2] <-- substitution
1:2:2:3:map (+1) x
1:2:2:3:map (+1) [1, 2, 2, 3] <-- substitution
1:2:2:3:2:3:3:4:map (+1) x
...
Это явно не то, что происходит. Я вижу шаблон в правильном ответе. Мы просто перемещаем один элемент в списке за раз в бесконечный поток. Я признаю шаблон, и я могу применить его в коде. Однако это не соответствует моей ментальной модели ленивой оценки. Он чувствует себя немного "волшебным". Где моя интуиция ошибается?