Ich bin neu in haskell und suche nach einigen Standardfunktionen, um mit Listen nach Indizes zu arbeiten.
Mein genaues Problem ist, dass ich nach 5 alle 3 Elemente entfernen möchte. Wenn es hier nicht klar genug ist, ist Illustration:
%Vor%Ich weiß, wie man große Funktionen mit vielen Parametern schreibt, aber gibt es dafür einen cleveren Weg?
Sie können List.splitAt
zusammen mit drop
:
Jetzt f [1..12]
ergibt [1,2,3,4,5,9,10,11,12]
. Beachten Sie, dass diese Funktion eleganter ausgedrückt werden kann, wenn uncurry
Control.Arrow.second
:
Da wir Control.Arrow
trotzdem verwenden können wir% c_de% löschen und stattdessen die Hilfe von splitAt
, kombiniert mit Control.Arrow.(&&&)
:
Aber jetzt ist klar, dass eine noch kürzere Lösung folgende ist:
%Vor%Wie Chris Lutz bemerkt, kann diese Lösung dann folgendermaßen verallgemeinert werden:
%Vor% Jetzt liefert take
die erforderliche Funktion. Beachten Sie, dass eine Lösung mit nofm 5 8
möglicherweise noch effizienter ist!
Wenden Sie etwas Mathematik an, indem Sie splitAt
verwenden , map
, snd
, filter
und mod
:
Die Idee hier ist, dass wir jedes Element in der Liste mit seinem Index, einer natürlichen Zahl i , paaren. Wir entfernen dann die Elemente, für die i% 8 & gt; 4 . Die allgemeine Version dieser Lösung lautet:
%Vor% Die Funktionen take
und drop
können Ihnen hier vielleicht helfen.
von diesen könnten wir eine Funktion erstellen, um einen Schritt zu machen.
%Vor%und dann können wir das verwenden, um unser Problem zu reduzieren
%Vor%Da dies keine primitive Form der Rekursion ist, ist es schwieriger, dies als eine einfache Falte auszudrücken.
So könnte eine neue Faltfunktion definiert werden, die Ihren Anforderungen entspricht
%Vor% dann ist die Definition von takeEveryNafterEveryM
einfach
Das ist meine Lösung. Es ist viel wie @ barkmadleys Antwort , nur mit take
und drop
, aber mit weniger Unordnung meiner Meinung nach:
Nicht sicher, ob es irgendwelche Preise für Geschwindigkeit oder Schlauheit gewinnen wird, aber ich denke, es ist ziemlich klar und prägnant, und es funktioniert sicherlich:
%Vor%