Я определяю два взаимно-рекурсивных списка для четных и нечетных чисел в ghci следующим образом:
> let evens = 0:map (+1) odds; odds = map (+1) evens
И затем я обращаюсь к thunks, используя :sp
> :sp evens
evens = _
> :sp odds
odds = _
> take 5 evens
[0,2,4,6,8]
> :sp evens
evens = 0 : 2 : 4 : 6 : 8 : _
:sp odds
odds = _
Обратите внимание на то, что odds
thunk не оценивается, хотя evens
был оценен для 5-го элемента. Я могу представить себе интуитивное объяснение этого. odds
должен быть явно вызван для оценки:
> take 5 odds
[1,3,5,7,9]
>:sp odds
odds = 1 : 3 : 5 : 7 : 9 : _
Однако теперь, когда я это делаю:
> take 10 evens
[0,2,4,6,8,10,12,14,16,18]
> :sp evens
evens = 0 : 2 : 4 : 6 : 8 : 10 : 12 : 14 : 16 : 18 : _
> :sp odds
odds = 1 : 3 : 5 : 7 : 9 : 11 : 13 : 15 : 17 : _
Обратите внимание, как теперь odds
thunk оценивается всякий раз, когда evens
оценивается? Почему odds
не оценивался в первый раз и оценивался во второй раз и во всех последующих оценках? Что происходит?