[Haskell-cafe] Help to solve simple problem !

Ezra Lalonde ezra.lalonde at gmail.com
Tue Nov 10 17:10:47 EST 2009


The following program should work:

=======compress.hs=============
toList :: (Eq a) => [a] -> [[a]]
toList [] = []
toList x = start : toList end
    where (start, end) = span (==(head x)) x

toTuple :: [a] -> (a, Int)
toTuple x = (head x, length x)

compress :: Eq a => [a] -> [(a, Int)]
compress x = map toTuple $ toList x
=============================

The important thing to understand here, is the "span" function from the
Prelude, and apply it recursively. 
*Main> span (=='A') "AAABCC"
("AAA","BCC")
*Main> span (=='h') "hhhaskell"
("hhh","askell")

I've used a function "toList" to separate each part of the string into a
separate element of a list:
*Main> toList "AAABCC"
["AAA","B","CC"]
*Main> toList "EEEZZZRRAAAA!!"
["EEE","ZZZ","RR","AAAA","!!"]

>From there, "toTuple" takes the first letter of the string, and puts it with
its length in a tuple:
*Main> toTuple "EEE"
('E',3)
*Main> toTuple "EEEEE"
('E',5)

Because of how it's defined, we also get the following:
*Main> toTuple "Ezra"
('E',4)

But that won't matter if we only use it after "toList", as in "compress".

Also, I've used your type signature for my solution, not your example
output; if you want it to be displayed like that, you'll have to write your
own function for printing.

This solution is probably not optimal, but it's a start.

Hope that helps,
Ezra


Aneto wrote:
> 
> Hi ! I am beginner in Haskell and have problems with this problem:
> compress :: Eq a => [a] -> [(a, Int)]
> If you have string "AAABCCC" it transforms it to : {A, 3} {B,1} {C,3}
> 
> Could you help me with it ?
> Thank you in advance !
> 

-- 
View this message in context: http://old.nabble.com/Help-to-solve-simple-problem-%21-tp26249028p26292205.html
Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.



More information about the Haskell-Cafe mailing list