[Haskell-cafe] Most elegant funciton for removing adjacent
duplicates from a list using foldl and foldr
sebastian.sylvan at gmail.com
Sun Mar 15 09:24:49 EDT 2009
2009/3/15 R J <rj248842 at hotmail.com>
> I need to write an implementation using foldl, and a separate
> implementation using foldr, of a function, "remdups xs", that removes
> adjacent duplicate items from the list xs. For example, remdups
> [1,2,2,3,3,3,1,1]= [1,2,3,1].
> My approach is first to write a direct recursion, as follows:
> remdups :: (Eq a) => [a] -> [a]
> remdups  = 
> remdups (x : ) = [x]
> remdups (x : xx : xs) = if x == xx then remdups (x : xs) else x :
> remdups (xx : xs)
> This code works, but it has three cases, not usual two, namely  and (x :
> What, if any, is the implementation using only two cases?
> Also, if three cases are required, then how can it be implemented using
> foldr, and how using foldl?
Perhaps it would be helpful to define a helper function with this signature:
prepend :: (Eq a) => a -> [a] -> [a]
Which for "prepend x xs" will put x at the front of the list, so long as the
first element of the list xs is different from x. Once you have this
function, take a look at the type signature for foldr.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe