Haskell lernen: Wie man einen Gegenstand aus einer Liste in Haskell entfernt
Versuchen zu lernen, Haskell. Ich bin versucht, zu schreiben eine einfache Funktion um eine Zahl zu entfernen aus einer Liste ohne Verwendung von built-in-Funktion (löschen...denke ich). Der Einfachheit halber nehmen wir an, dass der input-parameter ist eine Ganzzahl, und die Liste ist ein Integer-Liste. Hier ist der code, den ich habe, Bitte sagen Sie mir, was ist falsch mit dem folgenden code
areTheySame :: Int -> Int-> [Int]
areTheySame x y | x == y = []
| otherwise = [y]
removeItem :: Int -> [Int] -> [Int]
removeItem x (y:ys) = areTheySame x y : removeItem x ys
Kommentar zu dem Problem
Nur als Tipp, knacken öffnen Sie den Haskell 98 report und Lesen Sie den code für die Prelude-Funktionen ist ein echter eye-opener. Du wirst eine Menge lernen darüber, wie die Dinge funktionieren (und eine Menge lernen über Dinge, die Sie sollten nicht die Mühe, tut sich außer als eine Intellektuelle übung lernen!). Hier ist eine anständige tour: ww2.cs.mu.oz.au/172/Haskell/tourofprelude.html. members.chello.nl/hjgtuyl/tourdemonad.html und cs.anu.edu.au/student/comp1100/haskell/tourofsyntax.html sind auch hilfreich. (Leider haskell.org ist immer noch nach unten, so ich kann nicht hook up mit den Bericht direkt.) Kommentarautor: JUST MY correct OPINION
InformationsquelleAutor der Frage BM. | 2010-01-19
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die anderen haben Recht, das problem ist das
:
Betreiber. Ich würde sagen, dass IhrareTheySame
- Funktion, die eine Liste zurückgibt, ist der falsche Ansatz, trotzdem, obwohl. Statt Wechsel der++
Betreiber, eine bessere Umsetzung dieser Funktion wäre:Wie Sie sehen können, dies ist eine ziemlich einfache Implementierung. Auch, consing wie dies ist viel weniger belastend, für Ihr Programm als das anfügen einer Reihe von Listen zusammen. Es hat auch andere Vorteile, wie arbeiten träge.
InformationsquelleAutor der Antwort Chuck
Den
:
Betreiber nicht tun, was Sie denken, es bedeutet:Dauert es ein Element des Typs
a
und fügt es an den Anfang einer Liste des Typsa
. Sie verwenden es, um sich zwei Listen gebena
. Für die, die Sie verwenden müssen++
:Auch, wenn Sie eine rekursive Funktion, es braucht ein Ende-Bedingung. Also versuchen Sie dies:
So, wenn Sie an das Ende der Liste, wird die Funktion stop recursing.
InformationsquelleAutor der Antwort Chris Lutz
Können Sie auch dies tun, da eine Liste-das Verständnis
InformationsquelleAutor der Antwort Dagititis
Dies ist ein minimal-Update zu machen, Ihrem Beispiel zu arbeiten:
Erste, Sie brauchen, um zu verwenden
++
zum verketten von Listen, wie die:
operator, der verwendet wird, indem Sie addiert nur ein element am Anfang einer Liste (es kann weder verwendet werden, um Listen mit einem element noch hinzu, leere Listen). Sie vergleichen den Kopf der Liste (y
), um das Element, das Sie entfernen möchten, und richtig, das Element oder eine leere Liste mitareTheySame
. Dann wollen Sie rekursiv weiter mitremoveItem
auf den rest der Liste (ys
). Die resultierende Liste muss verknüpft werden mit++
.Sekunde, als Chris Lutz angemerkt, benötigen Sie eine Ende-Bedingung, wenn Sie erreichen das Ende der Liste. Durch hinzufügen dieser Zeile, Haskell weiß, was zu tun mit einer leeren Liste (das heißt, nichts, nur eine leere Liste zurück).
Als Chuck sagte, können Sie den code vereinfachen, für diese Aufgabe, indem er removeItem nicht delegieren die Aufgabe, den Vergleich, aber vergleichen Sie sich selbst und werfen Sie Weg das element ist, wenn es entfernt werden sollte, sonst halten Sie es in der Liste aus Kopf (mit
:
). In jedem Fall weiter rekursiv mit dem rest der Liste.InformationsquelleAutor der Antwort ahans
Referenz, können Sie daran interessiert zu sehen,wie es gemacht wird
delete
von Daten.Liste.Sie verlassen konnte
areTheySame
wie es ist, aber Sie würden dann verwenden müssen,concatMap
inremoveItem
Zusammenbruch der leere Listen:beziehungsweise
Beachten Sie, dass die Typen Ihrer Funktionen könnte mehr allgemein:
Dieser ermöglicht das entfernen von Elementen aus Listen jeglicher Art, für die
==
definiert ist, nicht nurInt
.InformationsquelleAutor der Antwort Greg Bacon
Schrieb ich eine Funktion in nur einer Zeile code:
Beispiel:
[1,2,3,4,6,7,8,9,10]
"acdef"
InformationsquelleAutor der Antwort Juan Carlos Kuri Pinto
Ich glaube, alle Lösungen gegeben, so weit die anders funktioniert, als die Daten.Liste.löschen, das löscht nur das erste Mitglied.
war mein Versuch zu löschen, nur das erste Mitglied (noch nicht erreichte bei D. L noch).
Es ist unklar, welches Verhalten die top-poster haben will.
InformationsquelleAutor der Antwort tphyahoo