// P08 (**) Eliminate consecutive duplicates of list elements. // If a list contains repeated elements they should be replaced with a // single copy of the element. The order of the elements should not be // changed. // // Example: // scala> compress(List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)) // res0: List[Symbol] = List('a, 'b, 'c, 'a, 'd, 'e) object P08 { // Standard recursive. def compressRecursive[A](ls: List[A]): List[A] = ls match { case Nil => Nil case h :: tail => h :: compressRecursive(tail.dropWhile(_ == h)) } // Tail recursive. def compressTailRecursive[A](ls: List[A]): List[A] = { def compressR(result: List[A], curList: List[A]): List[A] = curList match { case h :: tail => compressR(h :: result, tail.dropWhile(_ == h)) case Nil => result.reverse } compressR(Nil, ls) } // Functional. def compressFunctional[A](ls: List[A]): List[A] = ls.foldRight(List[A]()) { (h, r) => if (r.isEmpty || r.head != h) h :: r else r } }