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)

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top