Come ti (ri) mettere in atto iterate in Haskell?
-
04-10-2019 - |
Domanda
iterate :: (a -> a) -> a -> [a]
(Come probabilmente sapete) iterate
è una funzione che prende un valore di funzione e di partenza. Poi si applica la funzione al valore iniziale, quindi si applica la stessa funzione per l'ultimo risultato, e così via.
Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude>
Il risultato è una lista infinita. (È per questo che io uso take
).
La mia domanda come si dovrebbe implementare la propria funzione iterate'
in Haskell, utilizzando solo le basi (lambda (:)
(++)
, modello mataching, guardie, ecc)?
(Haskell principiante qui)
Soluzione
Bene, iterate costruisce un elenco infinito di valori a incrementato di f . Quindi vorrei iniziare scrivendo una funzione che anteporre qualche valore a alla lista ottenuto invocando ricorsivamente iterare con f a :
iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)
Grazie alla valutazione pigra, ma solo che sarà valutata parte della lista costruita necessario per calcolare il valore della mia funzione.
Altri suggerimenti
Si noti inoltre che è possibile trovare le definizioni concise per la gamma di funzioni di base Haskell nel report Preludio standard .
Leggendo questo elenco di definizioni semplici che essenzialmente bootstrap una ricca libreria di primitive prime può essere molto educativo e aprire gli occhi in termini di fornire una finestra sul "modo in Haskell".
Mi ricordo di un molto presto aha momento in poi la lettura:. data Bool = False | True