99 questions/Solutions/8: Difference between revisions

From HaskellWiki
No edit summary
 
m (Pointed to the correct module in which group is defined)
Line 6: Line 6:
</haskell>
</haskell>


We simply group equal values together (group), then take the head of each.  
We simply group equal values together (using Data.List.group), then take the head of each.  
Note that (with GHC) we must give an explicit type to ''compress'' otherwise we get:
Note that (with GHC) we must give an explicit type to ''compress'' otherwise we get:



Revision as of 20:31, 20 July 2010

(**) Eliminate consecutive duplicates of list elements.

compress :: Eq a => [a] -> [a]
compress = map head . group

We simply group equal values together (using Data.List.group), then take the head of each. Note that (with GHC) we must give an explicit type to compress otherwise we get:

Ambiguous type variable `a' in the constraint:
      `Eq a'
	arising from use of `group'	
    Possible cause: the monomorphism restriction applied to the following:
      compress :: [a] -> [a]
    Probable fix: give these definition(s) an explicit type signature
		  or use -fno-monomorphism-restriction

We can circumvent the monomorphism restriction by writing compress this way (See: section 4.5.4 of the report):

compress xs = map head $ group xs

An alternative solution is

compress [] = []
compress [a] = [a]
compress (x : y : xs) = (if x == y then [] else [x]) ++ compress (y : xs)