play more with monoids
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Tue, 23 Dec 2014 17:06:44 +0000 (22:36 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Tue, 23 Dec 2014 17:06:44 +0000 (22:36 +0530)
misc/monoids.hs

index 848dab9f44e03578d2ac9a5cb9d622e15da7a77c..f15c89fad2ed419f848e16937ec99aa338774181 100644 (file)
@@ -1,3 +1,4 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 module Monoids where
 
 import Data.Monoid
@@ -46,3 +47,29 @@ treeDepth' = treeFold 0 (\l _ r -> 1 + max l r)
 flatten' :: Tree a -> [a]
 flatten' = treeFold [] (\l x r -> l ++ [x] ++ r)
 
+-- monoids
+newtype Sum' a = Sum' a
+    deriving (Eq, Num, Ord, Show)
+
+getSum :: Sum' a -> a
+getSum (Sum' x) = x
+
+instance Num a => Monoid (Sum' a) where
+  mempty = 0
+  mappend = (+)
+
+newtype Prod' a = Prod' a
+    deriving (Eq, Num, Ord, Show)
+
+getProd :: Prod' a -> a
+getProd (Prod' x) = x
+
+instance Num a => Monoid (Prod' a) where
+  mempty = 1
+  mappend = (*)
+
+lst :: [Integer]
+lst = [1,5,8,23,423,99]
+
+prod :: Integer
+prod = getProd $ mconcat $ map Prod' lst