splitWith function for splitting a list doesn't seem optimal As an exercise from RWH, I needed to write a function that splits a list every time the predicate is false (words == splitWith (== ' ') for strings):

splitWith :: (a -&gt; Bool) -&gt; [a] -&gt; [[a]]
splitWith _ [] = []
splitWith p xs
    | null pre = splitWith p post'
    | otherwise = pre : splitWith p post'
    where
        (pre, post) = break p xs
        post' = if null post then [] else tail post


My concern is the if..then..else chain; it seems "forced". I have to make sure that post isn't null, or it will crash on the call to tail.

Is there a better way to write this?
You can gin up a safe version of tail lickety-split by using drop 1.