[Haskell-cafe] Re: Why is there no splitBy in the list module?

Donn Cave donn at drizzle.com
Tue Jul 11 03:20:35 EDT 2006


Quoth John Meacham <john at repetae.net>:
...
| just a note: I find splitBy a much nicer routine to provide.
|
|> splitBy :: (a -> Bool) -- ^ whether char is a separator
|>         -> [a] -- ^ list to split
|>         -> [[a]]

Starting from the assumption that in most cases the list to be split
will be [Char], so we can reasonably hold this up against string functions
in other languages -- I think split is commonly

  split :: String -> String -> [String]

i.e., the separator is [a], not a.  Of course next they'll want regular
expressions, but I use string separators of length > 1 a lot and rarely
bother with regexps.

But string splitBy might be an interesting alternative to regexp splits.
Something like

  splitBy :: ([a] -> Maybe Int) -> [a] -> [[a]]

  breakBy :: ([a] -> Maybe Int) -> [a] -> Maybe ([a], [a])
  breakBy f s = by [] f s
	where
		by _ _ [] = Nothing
		by c f s@(a:ax) = case f s of
			Just n -> Just ((reverse c), (drop n s))
			Nothing -> by (a:c) f ax

  splitBy f s = case breakBy f s of
	Just (l, r) -> l:(splitBy f r)
	Nothing -> [s]

Where in the simplest case the matching function would simply compare with
a separator string, but could easily do more - eat up trailing blanks,
for example.

Note use of Maybe, basically to disambiguate end of data with and without
match.

	Donn Cave, donn at drizzle.com


More information about the Haskell-Cafe mailing list