Expressing a sequence of scripted Python string replacement in Haskell

file-io, haskell, replace, text-processing

Solution

The simplest methods in Haskell involve mapping a `Char -> Char` replacement function (the `f` below) over the input, producing a new output (the `interact` function takes care of the fopen/fclose pattern):

main = interact $ map f
      where
        f '\n'   = ' '
        f '\r'   = ' '
        f 'é'    = 'e'
        f '\xa0' = ' '
        f c      = c

You can modify this to do your own IO, use the `Text` package etc, but the basic pattern of character transformations is the same.

Problem

I often use Python to replace various types of characters in text, using scripts that look like this: ``` #!/usr/bin/env python # coding=UTF-8 import sys for file in sys.argv[1:]: f = open(file) fs = f.read() r1 = fs.replace('\n',' ') r2 = r1.replace('\r',' ') r3 = r2.replace('. ','.\n\n') r4 = r3.replace('é','e') r5 = r4.replace('\xc2',' ') r6 = r5.replace('\xa0',' ') r7 = r6.replace(' ',' ') r8 = r7.replace(' ',' ') r9 = r8.replace('\n ','\n') f.close() print r8 ``` But I am learning Haskell now, because I am sick of Python. My best try at doing that in Haskell is ``` #!/usr/bin/runhaskell import System.IO main :: IO () main = do inh <- getArgs >>= withFileLines outh <- -- ?? mainloop inh outh hClose inh hClose outh replacements :: String -> String replacements = unwords $ map -- hmm.... ``` ...and, I have no idea where to go from there.

Original source