Entferne Elemente nach Index in haskell

8

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?

    
qba 14.11.2009, 23:52
quelle

8 Antworten

15

Zwei völlig unterschiedliche Ansätze

  1. Sie können List.splitAt zusammen mit drop :

    %Vor%

    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 und Control.Arrow.second :

    %Vor%

    Da wir Control.Arrow trotzdem verwenden können wir% c_de% löschen und stattdessen die Hilfe von splitAt , kombiniert mit Control.Arrow.(&&&) :

    %Vor%

    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!

  2. Wenden Sie etwas Mathematik an, indem Sie splitAt verwenden , map , snd , filter und mod :

    %Vor%

    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%
Stephan202 15.11.2009, 00:30
quelle
4

Da niemand eine Version mit "unfoldr" gemacht hat, hier ist mein Take:

%Vor%

Scheint die kürzeste bisher zu sein

    
ADEpt 15.11.2009 09:15
quelle
4

Sie können Ihre Elemente einfach zählen:

%Vor%

Obwohl die offene Codierung kürzer aussieht:

%Vor%     
dottedmag 15.11.2009 00:21
quelle
1

Die Funktionen take und drop können Ihnen hier vielleicht helfen.

%Vor%

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

%Vor%     
barkmadley 15.11.2009 00:24
quelle
1

Das ist meine Lösung. Es ist viel wie @ barkmadleys Antwort , nur mit take und drop , aber mit weniger Unordnung meiner Meinung nach:

%Vor%

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%     
Chris Lutz 15.11.2009 00:36
quelle
1
%Vor%     
Long 15.11.2009 01:18
quelle
1

Hier ist meine Meinung:

%Vor%     
user1291661 13.08.2015 02:05
quelle
0

Hier ist meine Lösung:

%Vor%

Beispiel:

%Vor%     
hiena 15.11.2009 00:22
quelle

Tags und Links