mapConserve
trait List[A] {
def mapConserve[B >: A](f: (A) => B): List[B]
}
mapConserve applies the function f to each element of this List and
returns it untouched if every transformed element is equal (in terms of eq)
to the element it was retrieved from.
If at least one transformed element is not equal (in terms of eq) to its source
element then this function creates a new List built from the transformed
results.