Prelude function suggestions
Simon Marlow
simonmar at microsoft.com
Thu Jul 29 05:48:08 EDT 2004
How about:
-- | Splits a list into components delimited by separators, where the
-- predicate returns True for a separator element. The resulting
-- components do not contain the separators. Two adjacent separators
-- result in an empty component in the output. eg.
--
-- @
-- > split (=='a') "aabbaca"
-- ["","","bb","c",""]
-- @
split :: (a -> Bool) -> [a] -> [[a]]
split p s = case rest of
[] -> [chunk]
_:rest -> chunk : split p rest
where (chunk, rest) = break p s
-- | Like 'split', except that sequences of adjacent separators are
-- treated as a single separator. eg.
--
-- @
-- > tokens (=='a') "aabbaca"
-- ["bb","c"]
-- @
tokens :: (a -> Bool) -> [a] -> [[a]]
tokens p = filter (not.null) . split p
'split' is the same as Python's split. There is already a precedent for
using short names in the Data.List module so I think 'split' is the
right choice, and 'tokens' is fairly descriptive.
Then we have
words = tokens isSpace
which is quite nice. Unfortunately
lines /= split (=='\n')
because lines strips off blank lines at the end. So perhaps we do need
the third version.
Cheers,
Simon
More information about the Libraries
mailing list