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 -> 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 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?