
Hi, I'm trying to split a string into a list of substrings, where substrings are delimited by blank lines. This feels like it *should* be a primitive operation, but I can't seem to find one that works. It's neither a fold nor a partition, since each chunk is separated by a 2-character sequence. It's also not a grouping operation, since ghc's Data.List.groupBy examines the first element in a sequence with each candidate member of the same sequence, as demonstrated by: Prelude> :module + Data.List Prelude Data.List> let t = "asdfjkl;" Prelude Data.List> groupBy (\a _ -> a == 's') t ["a","sdfjkl;"] As a result, I've wound up with this: -- Convert a file into blocks separated by blank lines (two -- consecutive \n characters.) NB: Requires UNIX linefeeds blocks :: String -> [String] blocks s = f "" s where f "" [] = [] f s [] = [s] f s ('\n':'\n':rest) = (s:f "" rest) f s (a:rest) = f (s ++ [a]) rest Which somehow feels ugly. This feels like it should be a fold, a group or something, where the test is something like: (\a b -> (a /= '\n') && (b /= '\n')) Any thoughts? Thanks, -- Adam