2013-03-10 12 views
5

Meine Fragen sind, wenn ich eine Zeichenfolge wie Hello, today is a Nice Day!! einfügen Wie könnte ich Leerzeichen und Satzzeichen loswerden und auch die Großbuchstaben mit Kleinbuchstaben ersetzen?Ersetze etwas in Haskell Listenerweiterungen

Ich weiß, wie man sie löscht, aber nicht wie man sie ersetzt.

Auch um die Interpunktion loszuwerden.

Entschuldigung, ich weiß nicht, wie man mit Strings herumhängt, nur Zahlen.

testList xs = [if x = [,|.|?|!] then " " | x<-xs] 

Antwort

7
import Data.Char 

Wenn Sie die Zeichensetzung auf Raum und die Zeichen aus Großbuchstaben umwandeln möchten Fall senken:

testList xs = [if x `elem` ",.?!" then ' ' else toLower x | x<-xs] 

Beispiel: testList "TeST,LiST!" == "test list "

Wenn Sie die Interpunktion löschen und die Zeichen von Großbuchstaben in Kleinbuchstaben konvertieren möchten:

testList2 xs = [toLower x | x<-xs, not (x `elem` ",.?!")] 

Beispiel: testList2 "Te..S,!t LiS?T" == "test list"

Wenn Sie nicht wollen oder können nicht Data.Char importieren, ist dies eine Implementierung von toLower:

toLower' :: Char -> Char 
toLower' char 
    | isNotUppercase = char -- no change required 
    | otherwise = toEnum (codeChar + diffLowerUpperChar) -- char lowered 
    where 
     codeChar = fromEnum char -- each character has a numeric code 
     code_A = 65 
     code_Z = 90 
     code_a = 97 
     isNotUppercase = codeChar < code_A || codeChar > code_Z 
     diffLowerUpperChar = code_a - code_A 
+0

Dies sollte ein Kommentar in meiner Antwort gewesen sein. Hast du es dir schon angesehen? –

+0

Das hilft so sehr. Vielen Dank. Die Macht, die der Professor uns gab, hatte nur Beispiele mit Zahlen, aber das räumt viele meiner Fragen zur Manipulation von Buchstaben auf. –

+0

Aber wie würde ich den toLower implementieren? Es gibt mir nicht im Umfang und ich habe versucht, den Import data.char hinzuzufügen, aber das gibt mir auch einen Fehler. EDIT: Ich habe es zur Arbeit nvm. –

2

Um die Interpunktion loszuwerden Sie einen Filter wie dieser

[x | x<-[1..10], x `mod` 2 == 0] 

man verwenden kann Die „if“ Sie verwenden nicht filtern. Wenn man einen if in den "map" Teil eines Listenverständnisses einfügt, kann man nur zwischen zwei Optionen wählen, aber man kann sie nicht herausfiltern.

Wie für Dinge Umwandlung in Kleinbuchstaben, die seine selben Trick, wie Sie können bereits in Zahlen abziehen:

[x*2 | x <- [1..10]] 
+1

es so etwas wie [x, so würde | x <-xs, x 'mod' 2 == 0]? –

+0

@BobBobington Nein, du verwendest 'mod x 2' oder' x '' mod' '2', was leichter zu lesen ist. Es ist fast das gleiche wie '1 + 2' oder' (+) 1 2' – kyticka

+0

Wie schreibe ich Backticks in Code? – kyticka

4

Ich habe schon seit langer Zeit einen Code in Haskell, ohne zu schreiben, aber die folgenden sollte entfernen sie die ungültigen Zeichen (ersetzen sie sie durch ein Leerzeichen) und auch die Zeichen aus Großbuchstaben umwandeln in Kleinbuchstaben:

import Data.Char 

replace invalid xs = [if elem x invalid then ' ' else toLower x | x <- xs] 

eine andere Möglichkeit, das gleiche zu tun:

repl invalid [] = [] 
repl invalid (x:xs) | elem x invalid = ' ' : repl invalid xs 
        | otherwise  = toLower x : repl invalid xs 

Sie können die replace (oder repl) Funktion wie folgt aufrufen:

replace ",.?!" "Hello, today is a Nice Day!!" 

Der obige Code zurück:

"hello today is a nice day " 

Edit: Ich verwende die toLower Funktion von Data.Char in Haskell, aber wenn Sie es selbst schreiben möchten, klicken Sie hier auf Stack Overflow. Diese Frage wurde schon früher gestellt.

0

Hier ist eine Version ohne Module zu importieren, fromEnum und toEnum mit denen Charaktere zur Auswahl ermöglichen:

testList xs = 
    filter (\x -> elem (fromEnum x) ([97..122] ++ [32] ++ [48..57])) $ map toLower' xs 
    where toLower' x = if elem (fromEnum x) [65..90] 
          then toEnum (fromEnum x + 32)::Char 
          else x 

OUTPUT: 
*Main> testList "Hello, today is a Nice Day!!" 
"hello today is a nice day" 

Für ein Modul losen Ersetzen-Funktion, so etwas wie dies funktionieren könnte:

myReplace toReplace xs = map myReplace' xs where 
    myReplace' x 
    | elem (fromEnum x) [65..90] = toEnum (fromEnum x + 32)::Char 
    | elem x toReplace   = ' ' 
    | otherwise     = x 

OUTPUT: 
*Main> myReplace "!," "Hello, today is a Nice Day!! 123" 
"hello today is a nice day 123" 
+0

Denken Sie daran, dass OP einige Zeichen durch ein Leerzeichen ersetzen möchte. –

4

Sie werden die Funktionen, die Sie in Data.Char brauchen:

import Data.Char 

process str = [toLower c | c <- str , isAlpha c] 

Obwohl persönlich denke ich, dass die Funktion kompositorischen Ansatz ist klarer:

process = map toLower . filter isAlpha 
+1

Dies löst das Problem nicht - OP möchte ungültige Zeichen durch Leerzeichen ersetzen, nicht löschen. Siehe @ OscarMederos Antwort. – luqui

+1

"Wie kann ich Leerzeichen und Satzzeichen loswerden und auch die Großbuchstaben durch Kleinbuchstaben ersetzen?" Das klingt für mich wie das OP Leerzeichen löschen möchte. –

+2

Vielleicht könnte das OP die Frage für Klarheit klären, wenn er etwas anderes meint. –