[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