Taking change - convergent iteration through iterate
Typically, where clauses don't include full type annotations, though this is mostly a matter of personal preference.
For prepending items to a list, prefer x:xs over [x] ++ xs.
In your "base case" of the recursive go function: go elem [] = [], elem is not used. Prefer _ in this case.
Your comment exceeds 80 characters in width. Again, a matter of personal preference. The note about passing an empty list returns an empty list is probably not necessary as this is very clearly the case from the code itself.


Here is how I would write this function:

takeWhileNotDup :: Eq a =&gt; [a] -&gt; [a]
takeWhileNotDup [] = []
takeWhileNotDup (x:xs) = x:go x xs
  where
    go _ [] = []
    go previous (x:xs)
      | previous /= x = x:go x xs
      | otherwise = []