As an exercise from RWH, I needed to write a function that splits a list every time the predicate is false (
splitWith (== ' ') for strings):
splitWith :: (a -> Bool) -> [a] -> [[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
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?