2017-09-19 4 views
0

accesing Ich bin ziemlich neu in Haskell, und versuchen Sie folgendes zu erreichen:Haskell die sublist während Filtern einer Liste aus einer Liste

filter (((!!) subList (fromJust (elemIndex String [String]))) == String) [[string]] 

ich die Namen mit ihren Typen ersetzt es leichter zu lesen. Das Problem ist, dass ich keine Unterliste machen kann, aber die (!!) nimmt eine Liste als Argument. Also, wie sollte ich das schreiben?

edit:

ich die Filterbedingung separat geschrieben, die funktionieren, aber das Problem ist immer noch das gleiche:

findGood :: [String] -> String -> [String] -> String -> Bool 

, aber ich brauche noch in allen Werten zu füllen, obwohl die ersten [ String] ist die Unterliste. Alle anderen Werte können eingegeben werden ..

Edit:

Ich löste es, was ich brauchte, war platziere die [Zeichenfolge] letzte, und dann konnte ich es auslassen im Filter

Also

findGood :: String -> [String] -> String -> [String] -> Bool 
      filter (findGood a b c) [[String]] 

Das ist was funktioniert, und das ist, was ich wollte. (Nicht um die D)

+1

Meine Vermutung ist, dass dies einfacher wird, wenn Sie die Funktion, die Sie filtern möchten, herausnehmen und separat schreiben. Aber es wäre einfacher zu verstehen, was Sie tun, wenn Sie uns einige Beispieleingaben und -ausgaben geben. –

+0

Wäre hilfreich, wenn Sie in Worten erklären könnten, was Sie hier versuchen wollten. – Erik

+1

Bitte erläutern Sie, anstatt * irgendein * ungültiges Codefragment * was * Sie erreichen möchten. Welches Problem möchten Sie mit diesem Filter lösen? –

Antwort

1

Vorausgesetzt, dass Sie Geld vergleichen wollen, sind und überprüfen money > 500 es macht viel mehr Sinn, es zu speichern als Int kein String. Außerdem würde ich sagen, dass jeder Eintrag als Tupel gespeichert wird und eine Tupelliste sinnvoller ist, als eine Liste von Listen zu verwenden (dies ist auch für die Int-Implementierung von Geld erforderlich, da Sie keine Liste verschiedener Listentypen haben können). .

So würde die Tabelle Typ [(String, Int)] haben.

filter geht durch die Liste und prüft jedes Element auf eine Bedingung. In diesem Fall ist die Bedingung so einfach, dass ich es nicht für nötig halte, sie zu einer eigenen Funktion zu machen (es sei denn, Sie müssen sie an vielen Stellen wiederverwenden).

Wenn wir ein Paar vom Typ (String, Int) bekommen, wollen wir nur prüfen, ob dieser zweite Wert> 500 ist. Also ist die Bedingung einfach snd row > 500 wo Zeile das Tupel ist, das wir als Zeile in der Tabelle angegeben haben.

Dies lässt uns mit: filter (\row -> snd row > 500) table

Testing auf [("Geoff", 600), ("Bill", 700), ("Bill Jr.", 10)] diese [("Geoff", 600), ("Bill", 700)] gibt wie erwartet.

+0

Danke, für das beschriebene Szenario funktioniert es in der Tat, aber ich brauchte eine Lösung für ein abstrakteres Problem. Speziell was ich in meinem zweiten Schnitt gemacht habe. – BaasBartMans

+0

@BaasBartMans Gern geschehen, beim nächsten Mal würde es wahrscheinlich helfen, wenn Sie das abstrakte Problem in der Frage beschreiben. Niemand kann dir helfen, wenn sie nicht wissen, was das Problem ist. –

Verwandte Themen