2017-03-14 3 views
1

Zur Zeit extrahieren, verwende ich Liste Verständnis durch eine Liste meiner benutzerdefinierten DatentypWie mehrere Werte aus einem Datensatz Haskell

data Person = Person{ fname :: String 
        , lname :: String 
        , age :: Int 
        , siblings :: [String] 
        } 

Das Problem zur Zeit zu gehen ist ich tue ["First name: " ++ fname z ++ "\n" ++ "Last name: " ++ lname z] wo jeder z a Person aus einer Liste von Person.

Ich habe

fas :: [Person] -> [String] 
fas listOfPerson = map fname listOfPerson 

so etwas wie

versucht, mit, aber wie kann ich Karte verwenden, um mehrere Felder aus dem Datensatz zu bekommen? von was ich verstehe Karte nimmt eine Funktion und eine Liste und wendet diese Funktion auf jedes Element in der Liste, eine neue Liste. Da ich möchte, dass die Ausgabe eine einzige Liste ist, muss ich nur map einmal aufrufen, oder kombinieren Sie mehrere Kartenaufrufe irgendwie in einer einzigen Liste, wo alle Informationen in Ordnung sind?

z. B. so etwas wie das?

fas :: [Person] -> [String] 
fas listOfPerson = map (fname, lname, age) listOfPerson 

danke

+0

Destrukturierung nachschlagen. Sie können alle Datensatzfelder in der Parameterliste der Funktion binden, indem Sie sie verwenden. – Carcigenicate

Antwort

3

Wenn ich verstehe, was Sie richtig fragen, man muss nur die richtige Funktion erstellen mit

renderPerson :: Person -> String 
renderPerson p = "First name: " ++ fname p ++ "\nLast name: " ++ lname p 

dann Karte mit, dass zur Karte:

map renderPerson listOfPerson 

, die Ihnen eine Liste von String s geben wird.

Aber vielleicht wollten Sie stattdessen eine Liste von Tupeln?

personTuple :: Person -> (String, String, Int) 
personTuple p = (fname p, lname p, age p) 

und verwenden

map personTuple listOfPerson 

, die Ihnen ein [(String, String, Int)]. Es gibt eine Vielzahl von syntaktisch-zuckerhaltigen Möglichkeiten, dies zu tun, wie zum Beispiel:

  • Lambda: map (\p -> (fname p, lname p, age p)) listOfPerson
  • Rekord (erfordert RecordWildCards Erweiterung) Wildcards: personTuple Person{..} = (fname, lname, age)
  • applicative: map ((,,) <$> fname <*> lname <*> age) listOfPerson

aber es ist am Ende alle gleich.

Verwandte Themen