[Haskell-beginners] Comments on Map/Reduce Code

Thomas Bach thbach at students.uni-mainz.de
Fri Jul 13 18:02:02 CEST 2012


Hi Brent,

thanks for your suggestions. I got further suggestions as a private
e-mail and finally came up with the following solution – suggestions
welcome:

==================== mapper.hs ====================
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.IO as TLIO

postFix :: TL.Text
postFix = TL.pack "\t1"

formatter :: TL.Text -> TL.Text
formatter x = TL.append x postFix

main = TLIO.interact pipeline
  where words = TL.words
        format = map formatter
        pipeline = TL.unlines . format . words
===================================================

==================== reducer.hs ===================
import qualified Data.Text.Lazy.IO as TLIO
import qualified Data.Text.Lazy as TL
import qualified Data.List as L
import Data.Function (on)

tuppleize :: TL.Text -> (TL.Text, Int)
tuppleize line = (word, num)
  where words = TL.words line
        word = head words
        num = read . TL.unpack $ last words

group :: Eq a => [(a, b)] -> [[(a, b)]]
group = L.groupBy ((==) `on` fst)

summation :: Num b => [(a, b)] -> (a, b)
summation ((x, y):xs) = (x, y + sum (map snd xs))

formatter :: (TL.Text, Int) -> TL.Text
formatter (w, i) = TL.append w (TL.pack ('\t':show i))

main = TLIO.interact pipeline
  where tuples = TL.lines
        group_tuples = group . map tuppleize
        sum_tuples = map (formatter . summation)
        pipeline = TL.unlines . sum_tuples . group_tuples . tuples
===================================================

The reducer still throws an error when piping in an empty
newline. But, I'm not sure, what a proper solution for this could be.

On Tue, Jul 10, 2012 at 10:19:48AM -0400, Brent Yorgey wrote:
> On Thu, Jul 05, 2012 at 03:50:32PM +0200, Thomas Bach wrote:
> 
> Instead of using a chain of ($), it's generally considered better
> style to use a chain of (.) with a single $ at the end, like

I often find myself trying different combinations of ($), (.) or
putting things in brackets, when the compiler throws an error on
me. Without really knowing why things sometimes work out and sometimes
don't. I find this part especially confusing!

Regards,

	Thomas



More information about the Beginners mailing list