How about this: wordsBy :: (a -> Bool) -> [a] -> [[a]] wordsBy p (x:xs) = if p x then wordsBy p xs else let (w, t) = getNextWord xs in (x:w) : t where getNextWord (x:xs) = if p x then ([], wordsBy p xs) else let (w, t) = getNextWord xs in (x:w, t) getNextWord _ = ([], []) wordsBy _ _ = [] (yuck) -Yitz