Я только начал изучать Haskell через несколько часов идти, пытаясь понять, что это The Fibonacci sequence делает:Понимание прямой самореференция в Haskell
fibs = 0 : 1 : next fibs
where
next (a : [email protected](b:_)) = (a+b) : next t
next
функция для меня странно, что в конечном итоге получить некоторые " недопустимый»вход, как в первом она выглядит следующим образом:
next (0:1) = (0+1) : next [1]
но next ([1])
не функционирует, так как [email protected](b:_)
не имеет входа в него. Итак, как работает next
?
И моя следующая путаница fib
сама, так как это предполагают, чтобы быть последовательность Фибоначчи, я предполагаю, что он будет получать fibs = 0 : 1 : 1 : next fibs
после первого шага, но тогда нам нужно будет вычислять next([0, 1, 1])
ведьма дает (0+1): next([1, 1])
== 1 : next([1, 1])
, мы получаем начальный элемент 1, поэтому в next([0, 1, 1])
первое значение списка (в следующих пунктах) будет 1, но прикрепит это 1 к исходному фиду, мы получим 0 : 1 : 1 : 1
, который не является последовательностью Фибоначчи.
Я думаю, что я что-то неправильно понял, так как это работает?
Ссылка на 'fibs' в первой строке ссылается на * полный (бесконечный) список *, а не только на два элемента, которые были явно определены. Первый шаг не 'next (0: 1)', это 'next (0: 1: next fibs)', и он оценивает '(0 + 1): next (1: next fibs)'. Конечные списки, такие как [0, 1, 1], никогда не участвуют. – Wyzard