[Haskell-cafe] Suggestions for improvement

N. Raghavendra raghu at mri.ernet.in
Sun Oct 3 15:52:27 EDT 2010


I am reading the book `The Haskell Road to Math, Logic, ...".  One of
the exercises in the first chapter asks for a function that maps a
string "abcd" to "abbcccdddd" and "bang!" to "baannngggg!!!!!".  Since
such a function f fixes the empty word, and maps wa to
f(w)a^(length(w)+1) for any word w and any letter a, I came up with the
following solution:

    -- Map "abcd" to "abbcccdddd" and "bang!" to "baannngggg!!!!!".
    blowup :: String -> String
    blowup [] = []
    blowup x = blowup (allButLast x) ++ lastToTheLength x

    -- Map "abcd" to "abc".
    allButLast :: String -> String
    allButLast [] = []
    allButLast [x] = []
    allButLast (x : xs) = x : allButLast xs

    -- Map "abcd" to d^4 = "dddd".
    lastToTheLength :: String -> String
    lastToTheLength [] = []
    lastToTheLength [x] = [x]
    lastToTheLength (_ : xs) = lastToTheLength xs ++ [last xs]

One question I have is whether I can eliminate points in the above
definition of blowup, and write something like

    blowup = (++) . (blowup . allButLast, lastToTheLength)

thinking of (++) as a function String x String -> String.  Also, I can't
figure out whether it is possible to get a shorter solution using fold.
I have tried Hlint on my file, but it gave no suggestions.

I am sure there are better ways, and would like some pointers and any
general suggestions for improvement.

Thanks and regards,
Raghavendra.

-- 
N. Raghavendra <raghu at mri.ernet.in> | http://www.retrotexts.net/
Harish-Chandra Research Institute   | http://www.mri.ernet.in/
See message headers for contact and OpenPGP information.



More information about the Haskell-Cafe mailing list