Dies ist meine take
Version mit foldr
:Implementierung nehmen foldr mit
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]
Der Ausgang ist nicht, was ich erwarten:
[3,4]
Ich habe dann versucht, durch debuggen die Länge y
in sich einfügen und das Ergebnis war:
[3,2,1,0]
Ich verstehe es nicht Warum werden die Längen in absteigender Reihenfolge eingefügt? Vielleicht etwas Offensichtliches, das ich vermisst habe?
oder in Worten ist der Grund, dass '' y' in Schritt xy' genannt von 'foldr' steht ** nicht ** für *" Rest noch der Liste zu sein verarbeitet "*, ** aber ** für *" Ergebnis der Verarbeitung des Rests der Liste "*. Ihre Funktion sagt also: "Wenn die Länge des verarbeiteten Rests der Liste bereits" n "oder mehr ist, fügen Sie ihr nichts vor, sondern fügen Sie das aktuelle Element" * "voran. –