
At 10:44 28/07/04 +0100, Keith Wansbrough wrote:
{- | Split the list at the occurrences of a separator into sub-list. This is a generalization of 'words'. -}
There should be two versions of this, one which treats repeated delimiters the same as single ones and ignores initial and final delimiters, and one which treats repeated delimiters as creating an empty field. Thus
split isSpace " foo bar baz " = ["foo","bar","baz"] split' isSpace " foo bar baz " = ["","foo","","bar","baz",""]
I'm not sure if I support your exact conclusion, but I think this raises an important consideration about exactly what split should be. I just scanned through my codebase for similar functions, and found two versions: [[ splitBy :: (a->Bool) -> [a] -> [[a]] splitBy _ [] = [] splitBy p (s0:str) = let (s1,sr) = break p str in (s0:s1):splitBy p sr t1 = splitBy (`elem` "/\\") "//foo\\bar/baz" == ["/","/foo","\\bar","/baz"] ]] The separator is *not* removed and [[ breakAll :: (a -> Bool) -> [a] -> [[a]] breakAll _ [] = [] breakAll p s = let (h,s') = break p s in h : breakAll p (drop 1 s') t2 = breakAll (==',') "ab,cde,f,g,hij,,kl,," == ["ab","cde","f","g","hij","","kl",""] ]] Where the separator is removed. I had requirements for both forms, but if it's not clear that one form is superior I'd be less inclined to try and "standardize" it at all. And all this makes me realize that there are several other candidates such as additional variations suggested by Keith. #g ------------ Graham Klyne For email: http://www.ninebynine.org/#Contact