[Haskell-beginners] Counting Fruits
Alexander Dunlap
alexander.dunlap at gmail.com
Fri Feb 20 00:01:24 EST 2009
On Thu, Feb 19, 2009 at 3:15 PM, Adolfo Builes
<builes.adolfo at googlemail.com> wrote:
> Hello everyone ,
> I wanted to do a small program which read a txt with fruit's name in each
> line and then print how many fruits I have of each type. something like
> these:
> apple
> apple
>
> and then
>
> [(apple,2)]
>
> I came up whit this
>
> import qualified Data.Map as Map
> import Data.List
> import System.IO
>
> main =
> do
> file <- readFile "fruits.txt"
> let answer = proccessFile $ lines file
>
>
> putStrLn (show answer)
>
> proccessFile :: [String] -> [(String,Int)]
> proccessFile file = Map.toAscList $ parseFile Map.empty file
> where parseFile fruits [] = fruits
> parseFile fruits_map (x:xs) = parseFile (Map.insertWith (+) x 1
> fruits_map) xs
>
>
> It works, but I would like to know how would you do it ?, Share different
> points of view, different code. Was it a good idea to use a Map ?, Did I
> separate the code in a proper way, I mean pure - impure ? How can we
> improve the performance ?
>
> Best Regards for everyone.
>
>
> Adolfo
You spelled "process" incorrectly ;). Not a big deal of course, just
makes your code a bit cleaner-looking.
In terms of actual code, I think "proccessFruits" could probably be
rewritten more clearly (and perhaps more efficiently, due to rewrite
rules) using a fold. You might also check out the "group" function
from Data.List, although that approach would probably be a bit slower.
Hope that helps.
Alex
More information about the Beginners
mailing list