Your second solution, a part from non preserving the ordering of the initial sequence, also requires the type of the list elements to be an instance of Ord. I've fixed a bug in your first version, where the return values of isIn where reversed. Here they are: module Main where import Data.List (sort, group) -- Need ordering on "a" uniqueS :: Ord a => [a] -> [a] uniqueS = concat . filter (null . drop 1) . group . sort -- Fixed Chaddai's solution -- Only need equivalent relation on "a" unique :: Eq a => [a] -> [a] unique xs = [x | x <- xs, isIn x xs 2] where isIn :: Eq a => a -> [a] -> Int -> Bool isIn _ _ 0 = False isIn _ [] _ = True isIn y (x:xs) n | y == x = isIn y xs (n-1) | otherwise = isIn y xs n main :: IO () main = do print $ uniqueS xs print $ unique xs where xs = [1,2,3,3,5,2,1,4] L. On Thu, Mar 29, 2012 at 9:30 AM, Chaddaï Fouché <chaddai.fouche@gmail.com>wrote:
On Thu, Mar 29, 2012 at 10:28 AM, Chaddaï Fouché <chaddai.fouche@gmail.com> wrote:
unique xs = nub (sort xs)
oops, I meant :
unique = concat . filter (null . drop 1) . group . sort
-- Jedaï