[Haskell-beginners] Re: Parsing a file with data divided into
sections
Heinrich Apfelmus
apfelmus at quantentunnel.de
Wed Feb 4 06:10:02 EST 2009
Magnus Therning wrote:
> Patrick LeBoutillier wrote:
>>
>> I wanted to parse a file that looks like this:
>>
>> MONDAY
>> JOHN
>> JIM
>> LINDA
>> TUESDAY
>> BILL
>> BOB
>> WEDNESDAY
>> THURSDAY
>> SAM
>> TODD
>> LARRY
>> LUKE
>> FRIDAY
>> TED
>>
>> in order to count the number of people for each day. After a (very)
>> long time and a lot of trial and error,
>> I managed to do it with this program:
Nice program, especially your use of function composition is good style.
> I think that you've pretty much used accumulators in the way they most
> often are used. In many cases you don't _have_ to keep count though.
> Here's one way to get the same result, but without keeping count:
>
> countDays [] = []
> countDays ls = let
> day = head ls
> count = length $ takeWhile (isSpace . head) $ tail ls
> in (day, count) : countDays (drop (1 + count) ls)
>
> main = interact (unlines . map show . countDays . lines)
Here's a version using span from the Prelude:
main = interact $ unlines . map show . countDays . lines
countDays [] = []
countDays (day:xs) = (day, length people) : countDays xs'
where (people, xs') = span (isSpace . head) xs
Note that this file format is very simple and it's ok to use lines and
isSpace to parse it. But the tool of choice are parser combinators
like Text.Parsec or Text.ParserCombinators.ReadP .
--
http://apfelmus.nfshost.com
More information about the Beginners
mailing list