Haskell - nth Element ohne "!!"

7

Hallo, ich brauche das n-te Element einer Liste, aber ohne das !! Operator. Ich bin extrem neu in Haskell, also würde ich mich freuen, wenn Sie detaillierter und nicht nur eine Zeile Code beantworten können. Das versuche ich gerade:

%Vor%

Aber ich bekomme: Parse Fehler (möglicherweise falsche Einrückung)

Vielen Dank im Voraus!

    
user43051 12.04.2013, 21:16
quelle

4 Antworten

12

Es gibt eine Menge, die ein bisschen hier ist,

%Vor%

ist technisch korrekt, wirklich wollen wir

%Vor%

So können wir das auf Listen von irgendetwas verwenden (optional)

%Vor%

Was Sie gerade gesagt haben, ist "Egal was Sie nthel return 0 geben". was eindeutig falsch ist.

%Vor%

Das ist einfach kein legaler Haskell. let ... in ... ist ein Ausdruck, es kann nicht in Top-Level verwendet werden.

Von dort bin ich nicht wirklich sicher, was das tun soll.

Vielleicht hilft Ihnen das, den richtigen Weg zu finden

%Vor%

Geben Sie% ce_de% mit Ihrer besten Schätzung ein und ich bin glücklich, von dort zu helfen.

Alternativ können Sie die Haskell-Syntax "pattern matching" verwenden. Ich erkläre, wie Sie dies mit Listen hier tun können.

Das ändert unser oben auf

%Vor%

Dies ist praktisch, da es die explizite Verwendung von explizitem <???> und head s unnötig macht.

    
jozefg 12.04.2013 21:39
quelle
8

Ich denke, du meintest das:

%Vor%

... was Sie vereinfachen können als:

%Vor%     
Gabriel Gonzalez 12.04.2013 22:23
quelle
1

Ich denke, Sie sollten es vermeiden, last zu verwenden, wann immer es möglich ist - Listen werden so erstellt, dass sie vom "Frontend" aus verwendet werden, nicht von der Rückseite. Was Sie wollen, ist die ersten n Elemente loszuwerden, und dann den Kopf der verbleibenden Liste zu bekommen (natürlich erhalten Sie einen Fehler, wenn der Rest leer ist). Sie können dies direkt wie folgt ausdrücken:

%Vor%

Oder kürzer:

%Vor%

Oder ein bisschen verrückt:

%Vor%     
Landei 13.04.2013 10:39
quelle
0

Wie Sie wissen, sind Listen nicht natürlich indiziert, aber es kann mit einem gemeinsamen Tipps überwunden werden.

Versuchen Sie es mit ghci, zip [0..] "hello" , Was ist mit zip [0,1,2] "hello" oder zip [0..10] "hello" ?
Ausgehend von dieser Beobachtung können wir nun leicht eine Möglichkeit finden, unsere Liste zu indizieren Darüber hinaus ist eine gute Illustration der Verwendung von Faulheit, ein guter Hinweis für Ihren Lernprozess.

Dann können wir basierend auf diesem Muster einen effizienten Algorithmus verwenden.

  1. Verwaltung von Begrenzungsfällen (leere Liste, negativer Index).
  2. Ersetzen Sie die Liste durch eine indizierte Version mit Reißverschluss.
  3. Rufen Sie ein Hilfsfunktionsdesign auf, um rekursiv unsere indizierte Liste zu bearbeiten.

Nun zur Helper-Funktion, die Liste darf nicht leer sein, dann können wir naiv Muster bilden, und,

  • Wenn unser Index gleich n ist, haben wir einen Gewinner
  • sonst, wenn unser nächstes Element leer ist, ist es über
  • Ansonsten rufen Sie die Hilfsfunktion mit dem nächsten Element auf.

Zusätzliche Anmerkung, da unsere Funktion fehlschlagen kann (leere Liste ...), könnte es eine gute Sache sein, unser Ergebnis mit Maybe type zu verpacken.

Wenn wir das alles zusammenfügen, enden wir damit.

%Vor%     
zurgl 13.04.2013 15:39
quelle

Tags und Links