Do some replacement in Haskell List Comprehensions

import Data.Char

If you want convert the punctuation to space and the characters from upper case to lower case:

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

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

If you want to delete the punctuation and convert the characters from upper case to lower case:

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

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

If you don't want or can not import Data.Char, this is an implementation of 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

I've been without writing a code in Haskell for a long time, but the following should remove the invalid characters (replace them by a space) and also convert the characters from Uppercase to Lowercase:

import Data.Char

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

Another way of doing the same:

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

You can call the replace (or repl) function like this:

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

The above code will return:

"hello  today is a nice day  "

Edit: I'm using the toLower function from Data.Char in Haskell, but if you want to write it by yourself, check here on Stack Overflow. That question has been asked before.


You will find the functions you need in Data.Char:

import Data.Char

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

Though personally, I think the function compositional approach is clearer:

process = map toLower . filter isAlpha