[Haskell-cafe] Re: Missing join and split

ChrisK haskell at list.mightyreason.com
Sat Dec 29 09:20:14 EST 2007


Albert Y. C. Lai wrote:
> Mitar wrote:
>> I am really missing the (general) split function built in standard
>> Haskell. I do not understand why there is something so specific as
>> words and lines but not a simple split? The same goes for join.
> 
> Don't forget Text.Regex.splitRegex.

Which is just:

> matchRegexAll p str = matchM p str

> {- | Splits a string based on a regular expression.  The regular expression
> should identify one delimiter.
> 
> This is unsafe if the regex matches an empty string.
> -}
> 
> splitRegex :: Regex -> String -> [String]
> splitRegex _ [] = []
> splitRegex delim str =
>     case matchRegexAll delim str of
>        Nothing -> [str]
>        Just (firstline, _, remainder, _) ->
>            if remainder == ""
>               then firstline : [] : []
>               else firstline : splitRegex delim remainder

Inlining the matchRegexAll/matchM means this is 8 lines of code.

Any given split function is very short, but there are enough design choices that
  I think the best library is none at all; the user can write exactly what they
want in <= 10 lines of code.

Though now that I look at it again, I think I like

> splitRegex :: Regex -> String -> [String]
> splitRegex _ [] = []
> splitRegex delim strIn = loop strIn where
>   loop str = case matchM delim str of
>                Nothing -> [str]
>                Just (firstline, _, remainder) ->
>                  if null remainder
>                    then [firstline,""]
>                    else firstline : loop remainder

slightly better.  I'll eventually update the unstable regex-compat.

-- 
Chris



More information about the Haskell-Cafe mailing list