Pregunta

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

(Como usted probablemente sabe) iterate es una función que toma un valor de función y de partida. A continuación, se aplica la función al valor inicial, a continuación, se aplica la misma función que el último resultado, y así sucesivamente.

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 ¿cómo implementar su propia función iterate' en Haskell, utilizando sólo los conceptos básicos (lambdas (:) (++), patrón mataching, guardias, etc.)?

(Haskell principiante aquí)

¿Fue útil?

Solución

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

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

Gracias a la evaluación perezosa, solo que será evaluada parte de la lista construida necesario calcular el valor de mi función.

Otros consejos

Tenga en cuenta también que se pueden encontrar definiciones concisas para la gama de funciones básicas de Haskell en el informe Preludio estándar .

Lectura a través de esta lista de definiciones sencillas que bootstrap esencialmente una rica biblioteca de primitivas primas puede ser muy educativo y reveladora en términos de proporcionar una ventana a la "manera Haskell".

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top