Haskell - Großschreibung aller Buchstaben in einer Liste [String] mit toUpper
Habe ich eine Liste [String] die Aufgabe ist, entfernen Sie diese Elemente in der Liste, die Sie "q" oder "p" und dann profitieren alle Buchstaben in die Liste mit toUpper.
Was ich versucht habe ist doch wie folgt:
delAndUpper :: [String] -> [String]
delAndUpper myList = filter (\x -> not('p' `elem` x || 'q' `elem` x)) myList
Es entfernt die unerwünschten Elemente aus der Liste richtig, allerdings kann ich nicht gelten toUpper auf dieser Liste, da der Typ von toUpper ist Char.
Versuchte ich es mit Karte und es funktioniert nicht.
delAndUpper myList = map toUpper (filter (\x -> not('p' `elem` x || 'q' `elem` x)) myList)
Ich weiß, dass toUpper in dieser Codezeile wird eine Liste als Wert und deshalb kann es nicht funktionieren, aber die wissen, wie man eine Ebene in der Liste und anwenden map toUpper.
Könnten Sie mir bitte helfen.
Vielen Dank im Voraus!
Grüße
InformationsquelleAutor John | 2013-05-06
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuordnung eine Ebene tiefer
Müssen Sie
map (map toUpper)
.Dies ist, weil Sie haben
[String]
stattString
.d.h.
map toUpper
nutzt eine Zeichenfolge, indem Sie jeden Buchstaben in Großbuchstaben, somap (map toUpper)
profitiert jeder String in eine Liste von Strings.Ihre Funktion wird
dave4420 gemacht guter Vorschlag, dass
(map.map) toUpper
ist eine nette Art zu schreibenmap (map toUpper)
, die Ihnen hilft, denken Sie zwei Listen von Ebenen ganz einfach und natürlich - haben Sie einen Blick auf seine Antwort zu.Können wir un-hardwire p und q?
Sie fragte, ob es nicht einen kürzeren Weg zu schreiben, den Zustand, und wusste nicht, wie schwer die Kodierung der
`q`
und`p`
. Ich Stimme denen mehreren`elem`
bits sind nicht schön. Wir übergeben die Liste der unzulässigen Buchstaben-und Aufräumen ein bisschen:Hier
(`elem` omit)
prüft ein Zeichen, wenn es in der Liste der diejenigen, die uns dazu führen würden, auslassen das Wort, so(any (`elem` omit) xs)
überprüft, ob die Zeichen derxs
sind verboten. Natürlich ist dies nicht verboten, es istok
.Ihre ursprüngliche
delAndUpper
wäre jetztdelAndUpper "pq"
, oder wenn Sie wollen auch verbieten, Kapital P und Q,delAndUpper "pqPQ"
. (Mehr dazu später.)Können wir es präziser?
Lasst uns sehen, ob wir nicht schreiben können
ok
ein wenig kürzer. Mein Erster Gedanke war der Einsatz vonpointfree
auf (siehe meine Antwort auf eine andere Frage für details, wie es läuft im ghci), aber es schien zu hängen, so dass die Verwendung von standard-Transformations-tricks, wir können Komponierennot
mit einer Funktion, die zwei Argumente nimmt, bevor er uns einen Bool-by-doing -(not.).f
stattnot.f
als würden wir mit einer Funktion, die Gaben uns ein Boolescher Wert, der nach der ersten Eingabe.any
ist unter(`elem` omit)
als erstes argument. Dies gibt unsaus, die wir können, entfernen Sie die nachfolgende xs:
- und inline:
Bin ich nicht scharf auf die nachfolgende
strings
entweder:(Wir könnten loszuwerden, die
omit
argument als gut und gehen völlig point frei, aber das Recht etwas zu weit nach unten in den hart-zu-Lesen-road für meinen Geschmack.)Wohin F?
Ist dies die erforderliche Verhalten? Es scheint seltsam, um gezielt ausschließen das kleingeschriebene Varianten und dann alles in Großbuchstaben. Wir könnten es tun, die andere Weise Runde:
geben
delAndUpper myList = map (map toUpper (filter (\x -> not('p'
elem` x || 'q'elem
x)) myList))`. und ich dachte, es ist der falsche Weg 🙁elem
x || 'q'elem
x. e.g, wenn es nicht zwei Zeichen als Zustand, sondern drei und vier und so weiter, imho wäre es besser, wenn man könnte Sie als eine concatanation und übergeben Sie es als parameter an die Funktion statt hart codieren es. Irgendeine Idee? DankVerwenden
(map . map)
stattmap
.n.b.
(map . map) toUpper
ist das gleiche wiemap (map toUpper)
wie vorgeschlagen, durch die anderen Antworten. Ich erwähne es, weil ich persönlich finde es übersichtlicher: es sieht mehr aus wie es geht nach unten auf zwei Ebenen anwendentoUpper
. (Sie sind möglicherweise nicht vertraut mit der Funktion Zusammensetzung operator(.)
, schauen Sie oder Fragen Sie nach, wenn Sie müssen.)Andere Funktionen mit einer ähnlichen Typ (
(a -> b) -> something a -> something b
), wiefmap
,Data.Map.map
,first
undsecond
können miteinander kombiniert werden und mitmap
in ähnlicher Weise.Vielleicht Sie nicht finden
(map . map) toUpper
klarer alsmap (map toUpper)
; fair genug.Du bist fast da, Sie brauchen nur eine zweite
map
.Dies ist, weil
String
ist völlig gleichbedeutend mit[Char]
in Vanille haskell. Da ist der Typ von map ist dieund wir haben
Bekommen wir wieder ein anderes
String
außer großgeschrieben.Durch die Art und Weise, dass hässliche-ish-filter ersetzt werden kann, aus schöner, indem Sie es mit den Pfeiltasten 🙂 (Denken Sie an diese, wie mehrere strukturierte Funktionen)
Unentgeltlichkeit? Vielleicht, aber irgendwie cool.