fork download
  1. import Data.Function ((&))
  2. import Text.Printf
  3.  
  4. data SaleSum = SaleSum {
  5. totalCost :: Double,
  6. totalQuantity :: Int
  7. }
  8.  
  9. class SaleSummary s where
  10. summary :: s -> SaleSum
  11.  
  12. instance Semigroup SaleSum where
  13. (SaleSum c1 q1) <> (SaleSum c2 q2) = SaleSum (c1 + c2) (q1 + q2)
  14.  
  15. instance Monoid SaleSum where
  16. mempty = SaleSum 0.0 0
  17.  
  18. instance Show SaleSum where
  19. show (SaleSum cost quantity) =
  20. "Total cost = " ++ printf "%.2f" cost ++ ", quantity = " ++ show quantity
  21.  
  22. totalSummary :: SaleSummary s => [s] -> SaleSum
  23. totalSummary xs = xs & map summary & mconcat
  24.  
  25. ----------------------------------------------------------------
  26.  
  27. data Sale = Sale {
  28. itemID :: String,
  29. price :: Double,
  30. quantity :: Int
  31. -- maybe some other fields
  32. }
  33.  
  34. instance SaleSummary Sale where
  35. summary s = SaleSum (price s * fromIntegral (quantity s)) (quantity s)
  36.  
  37. testSales = [
  38. Sale "Foo" 0.20 4,
  39. Sale "Bar" 1.10 3
  40. ]
  41.  
  42. main = print $ totalSummary testSales
Success #stdin #stdout 0s 4360KB
stdin
Standard input is empty
stdout
Total cost = 4.10, quantity = 7