2013-03-10 2 views
5

Moje pytanie jest, jeśli wstawię ciąg zawierający takie jak Hello, today is a Nice Day!! Jak mogę pozbyć się spacji i interpunkcji, a także zastępując wielkie litery małymi literami?Czy wymiana w Haskell List Comprehensions

Wiem, jak je usunąć, ale nie można ich wymienić.

Aby pozbyć się interpunkcji.

Przepraszam, że nie wiem, jak sobie radzić z ciągami, tylko liczbami.

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

Odpowiedz

7
import Data.Char 

Jeśli chcesz przekonwertować znaki interpunkcyjne do miejsca i postacie z wielkich liter na małe litery:

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

Przykład: testList "TeST,LiST!" == "test list "

Aby usunąć znaki interpunkcyjne i przekształcić znaki z dużych liter na małe litery:

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

Przykład: testList2 "Te..S,!t LiS?T" == "test list"

Jeśli nie chcą lub nie mogą importować Data.Char, jest to realizacja 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

To powinien być komentarz w mojej odpowiedzi. Czy już to zauważyłeś? –

+0

To bardzo pomaga. Dziękuję Ci. Moc, którą dał nam profesor, zawierała tylko przykłady liczb, ale to wyjaśnia wiele moich pytań dotyczących manipulowania literami. –

+0

Ale jak zaimplementować to toLower? Daje mi Nie w zakresie i próbowałem dodać import data.char, ale to również daje mi błąd. EDIT: Mam go do pracy nvm. –

2

Aby pozbyć się znaków interpunkcyjnych można użyć filtru jak ten

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

W „czy” używasz nie będą filtrowane. Umieszczenie znaku "jeśli" w części "mapy" na liście spowoduje tylko wybór między dwiema opcjami, ale nie można ich tam odfiltrować.

chodzi o konwersję rzeczy na małe litery, jego taka sama sztuczka, jak można już zjechać w liczbach:

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

Więc byłoby to coś jak [x | x <-xs, x 'mod' 2 == 0]? –

+0

@BobBobington Nie używasz 'mod x 2' lub' x '' mod'' 2', który jest łatwiejszy do odczytania. Jest prawie taki sam jak '1 + 2' lub' (+) 1 2' – kyticka

+0

Jak pisać zwrotne w kodzie? – kyticka

4

Byłem bez konieczności pisania kodu w Haskell przez długi czas, ale następujące powinny usunąć nieprawidłowe znaki (zastąpić je spacją), a także konwertować znaki z wielkie litery na małe litery:

import Data.Char 

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

Innym sposobem robi to samo:

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

można wywołać funkcję replace (lub repl) tak:

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

Powyższy kod zwróci:

"hello today is a nice day " 

Edit: używam funkcji toLower z Data.Char w Haskell, ale jeśli chcesz napisać to sam, sprawdź tutaj w Stack Overflow. Pytanie to było już wcześniej zadawane.

0

Oto wersja bez importowania modułów, używając fromEnum i toEnum na wybór znaków, aby umożliwić:

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" 

dla funkcji modułu mniej zastąpić, coś jak to może działać:

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

Pamiętaj, że OP chce zastąpić niektóre znaki także spacją. –

4

Znajdziesz potrzebne funkcje: Data.Char:

import Data.Char 

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

Chociaż osobiście uważam, że podejście kompozycyjny funkcja jest wyraźniejszy:

process = map toLower . filter isAlpha 
+1

To nie rozwiązuje problemu - OP chce zastąpić nieprawidłowe znaki spacją, a nie je usuwać. Zobacz odpowiedź @ OscarMederosa. – luqui

+1

"Jak mogę pozbyć się spacji i interpunkcji, a także zastępować wielkimi literami małymi literami?" To brzmi dla mnie tak, jak OP chce usunąć spacje. –

+2

Być może OP mógłby edytować pytanie dla jasności, jeśli ma na myśli coś innego. –