Una ventaja de la programación funcional es que se puede evaluar una expresión con la mano como si fuera un problema de matemáticas:
fibs = 0 : 1 : [ a + b | (a, b) <- zip fibs (tail fibs)]
= 0 : 1 : [ a + b | (a, b) <- zip [0, 1, ??] (tail [0, 1, ??])]
Aquí el ??
es la pieza que aún no se ha evaluado. Lo llenaremos mientras procedemos.
= 0 : 1 : [ a + b | (a, b) <- zip [0, 1, ??] [1, ??])]
= 0 : 1 : [ a + b | (a, b) <- (0, 1) : zip [1, ??] [??]]
en cuenta que estoy elidiendo la evaluación de zip
desde su definición no se da aquí y los detalles no son realmente con la cuestión actual. Esta es la notación que usaré para mostrar que cada par de números es creado por zip
y consumido por la lista de comprensión.
= 0 : 1 : 0+1 : [ a + b | (a, b) <- zip [1, ??] [??]]
= 0 : 1 : 1 : [ a + b | (a, b) <- zip [1, ??] [??]]
Ahora sabemos que el siguiente elemento de la ??
es un 1
:
= 0 : 1 : 1 : [ a + b | (a, b) <- zip [1, 1, ??] [1, ??]]
= 0 : 1 : 1 : [ a + b | (a, b) <- (1, 1) : zip [1, ??] [??]]
= 0 : 1 : 1 : 1+1 : [ a + b | (a, b) <- zip [1, ??] [??]]
= 0 : 1 : 1 : 2 : [ a + b | (a, b) <- zip [1, ??] [??]]
Y el siguiente elemento es un 2:
= 0 : 1 : 1 : 2 : [ a + b | (a, b) <- zip [1, 2, ??] [2, ??]]
Enjuague y repita.
Esto no es un guardia. Esto es una lista de comprensión. http://www.haskell.org/haskellwiki/List_comprehension – pmr
¿Estás seguro de que esta es la secuencia correcta de Fibonacci? El primer elemento debería ser 1 en mi opinión. – shuhalo