Questa è la mia versione take
utilizzando foldr
:Implementazione prendere usando foldr
myTake n list = foldr step [] list
where step x y | (length y) < n = x : y
| otherwise = y
main = do print $ myTake 2 [1,2,3,4]
L'uscita non è quello che mi aspetto:
[3,4]
Allora ho provato a eseguire il debug inserendo la lunghezza del y
in se stesso e il risultato è stato:
[3,2,1,0]
non capisco perché le lunghezze sono inserite in ordine decrescente. Forse qualcosa di ovvio mi è mancato?
o in parole, il motivo è che '' y' in fase xy' chiamato da 'foldr' sta ** non ** per *" resto del listino ancora da elaborato "*, ** ma ** per *" risultato dell'elaborazione del resto dell'elenco "*. Quindi la tua funzione dice, * "se la lunghezza del resto della lista elaborato è già' n' o più, non anteporre nulla ad essa, altrimenti anteponi l'elemento corrente "*. –