2010-09-22 6 views
8
iterate :: (a -> a) -> a -> [a] 

(Como probablemente sepa) iterate es una función que toma una función y un valor inicial. Luego aplica la función al valor inicial, luego aplica la misma función al último resultado, y así sucesivamente.¿Cómo implementarías (re) iterar en Haskell?

Prelude> take 5 $ iterate (^2) 2 
[2,4,16,256,65536] 
Prelude> 

El resultado es una lista infinita. (es por eso que uso take). Mi pregunta de cómo implementaría su propia función iterate' en Haskell, usando solo lo básico ((:)(++) lambdas, mataching de patrones, protecciones, etc.)?

(principiante Haskell aquí)

Respuesta

22

Bueno, iterate construye una lista infinita de valores un incrementa en f. Así que me gustaría empezar por escribir una función que antepone algún valor un a la lista construida por iterate recursiva llama con fa:

iterate :: (a -> a) -> a -> [a] 
iterate f a = a : iterate f (f a) 

Gracias a la evaluación perezosa, únicamente la parte de la lista construida necesario calcular el valor de mi función será evaluado

+0

Gracias por su respuesta. –

+0

Esto se ve como una variación de la definición de "arreglo" "arreglo f = f (arreglo f)" similar a ... "iterar f (fa)" podría usar arreglo para definir iterar: "iterar fa = corregir (\ rx -> x: r (fx)) a "no es mejor que eso, solo idea ID decir :) – QuantumKarl

12

También tenga en cuenta que puede encontrar definiciones concisas para la gama de funciones básicas de Haskell en el informe Standard Prelude.

Al leer esta lista de definiciones sencillas que esencialmente arrancan una biblioteca enriquecida de primitivas en bruto, pueden ser muy educativas y abrir los ojos en términos de proporcionar una ventana al "camino de Haskell".

Recuerdo un momento muy temprano de lectura: data Bool = False | True.

+0

¡Buen enlace! Muy educativo! –