Я совершенно новый для Haskell, и я пытаюсь обернуть вокруг себя то, как работает ленивое выражение последовательностей Фибоначчи.Haskell Fibonacci Пояснение
Я знаю, что это было задано раньше, но ни один из ответов не затронул проблему, которую я испытываю, визуализируя результат.
код является каноническим с помощью zipWith
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Я понимаю следующее:
zipWith
буквально молниеносно два списка вместеtail
грейферов все, кроме первого элемента списка- Haskell ссылается на «вычисленные» данные как
thunks
.
В моем понимании, это первый добавляет [0,1,<thunk>]
и [1,<thunk>]
использованием zipWith (+)
дать [1,<thunk>]
. Так что теперь у вас есть
fibs = 0 : 1 : 1 : zipWith (+) fibs (tail fibs)
Много ссылок я Гугле потом приступил к «визуализировать» строку выше, как
fibs = 0 : 1 : 1 : zipWith (+) [1,1,<thunk>] ([1,<thunk>]).
Мой вопрос заключается в следующем:
Почемуfibs
Компонент в строке выше соответствует только[1,1,<thunk>]
вместо[0,1,1,<thunk>]
?
Не должен fibs
содержать весь список плюс <thunk>
?
хороший способ понять такие определения является [название промежуточных значений] (http://stackoverflow.com/a/20978114/849891), которые приходят в существование, как мы постепенно к ним доступ (например, в 'взять 3 fibs'). Таким образом, нет никакой путаницы между тем, что один и тот же доступ к данным дважды (через одно и то же имя) или две равные части данных (каждая из которых имеет собственное имя). –