\$\begingroup\$
\$\endgroup\$
0
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?
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Sep 7, 2014 at 0:25
1 Answer 1
\$\begingroup\$
\$\endgroup\$
1
You can gin up a safe version of tail
lickety-split by using drop 1
.
answered Sep 7, 2014 at 2:20
-
\$\begingroup\$ Seriously -_-. I've actually used that before. Thank you; that solves it nicely. \$\endgroup\$Carcigenicate– Carcigenicate2014年09月07日 02:34:40 +00:00Commented Sep 7, 2014 at 2:34
lang-hs