2013-06-10 12 views
13

Ripetere is defined come segue:Perché la ripetizione definita in Preludio così com'è?

repeat :: a -> [a] 
repeat x = xs where xs = x:xs 

C'è qualche ragione che la segue non viene utilizzato?

repeat :: a -> [a] 
repeat x = x : repeat x 

(Ovviamente ci sono molte definizioni equivalenti per molte funzioni Prelude, ma la mia ultima descrizione appena si sente molto più evidente. Mi chiedo se c'è una ragione prestazioni o di stile per il modo in cui è.)

+6

[Vedere la mia risposta qui] (http://stackoverflow.com/questions/16632143/why-recursive-let-make-space-effcient/16632403#16632403). La definizione lì usa 'let', ma è lo stesso comportamento con' where'. – hammar

risposta

20

E ' è per motivi di prestazioni e complessità dello spazio.

La prima versione del codice utilizza la condivisione esplicita; sembra fondamentalmente un elenco circolare circolare a un elemento in memoria (lo xs nel codice è un nodo elenco che ha il valore x e i punti di coda allo stesso nodo elenco). Quando si valutano sempre più elementi della lista, verrà ripetuto lo stesso nodo ripetutamente.

Al contrario, la seconda versione crea un elenco che cresce effettivamente in memoria mentre viene valutato, poiché le diverse chiamate di vengono sempre ricalcolate (e non memoizzate). Ci sarà sempre un altro thunk non valutato alla fine della lista generata.

Problemi correlati