fork download
  1. {-# LANGUAGE GADTs #-}
  2.  
  3. import Data.List
  4. import Data.Map as Map
  5. import Data.Time
  6.  
  7. data Model a where
  8. Variant :: [(Day, a)] -> Model a
  9. deriving (Show)
  10.  
  11. day1 = fromGregorian 1987 10 17
  12. day2 = fromGregorian 1987 10 18
  13. day3 = fromGregorian 1987 10 19
  14. day4 = fromGregorian 1987 10 20
  15. day5 = fromGregorian 1987 10 21
  16. day6 = fromGregorian 1987 10 22
  17.  
  18. m1 = Variant [(day1, 1), (day3, 3), (day5, 5)] :: Model Integer
  19. m2 = Variant [(day1, 1), (day2, 2), (day4, 4), (day6, 6)] :: Model Integer
  20.  
  21. (Variant a) &+ (Variant b) =
  22. Variant $ snd $ mapAccumL (\r (d, k) -> let r' = r + k in (r', (d, r'))) 0
  23. $ toList $ Map.unionWith (+)
  24. (Map.fromDistinctAscList a)
  25. (Map.fromDistinctAscList b)
  26.  
  27. main = print $ m1 &+ m2
Success #stdin #stdout 0s 6264KB
stdin
Standard input is empty
stdout
Variant [(1987-10-17,2),(1987-10-18,4),(1987-10-19,7),(1987-10-20,11),(1987-10-21,16),(1987-10-22,22)]