fork download
  1. import Data.Monoid
  2. import Data.Foldable (foldMap)
  3. import Control.Arrow
  4.  
  5. type Pattern = String
  6. type Weight = Int
  7. type Cluster = [(Pattern, Weight)]
  8.  
  9. clusters :: [Cluster]
  10. clusters =
  11. [ [("a1", 1), ("a2", 2), ("a3", 3)]
  12. , [("b1", 4), ("b2", 5)]
  13. , [("c1", 7), ("c2", 8), ("c3", 9)]
  14. , [("d1", 10), ("d2", 11), ("d3", 12)]
  15. ]
  16.  
  17. allCombs :: [a] -> [[[a]]]
  18. allCombs [] = [[[]]]
  19. allCombs (x:xs) = zipWith (++) ([] : map (map (x:)) next) (next ++ [[]])
  20. where next = allCombs xs
  21.  
  22. mixClusters :: [Cluster] -> Cluster
  23. mixClusters = map (second getSum . foldMap (second Sum)) . sequence
  24.  
  25. mixAllClusters :: [Cluster] -> Cluster
  26. mixAllClusters = concatMap mixClusters . concat . tail . allCombs
  27.  
  28. main = mapM_ print $ mixAllClusters clusters
Success #stdin #stdout 0s 4708KB
stdin
Standard input is empty
stdout
("a1",1)
("a2",2)
("a3",3)
("b1",4)
("b2",5)
("c1",7)
("c2",8)
("c3",9)
("d1",10)
("d2",11)
("d3",12)
("a1b1",5)
("a1b2",6)
("a2b1",6)
("a2b2",7)
("a3b1",7)
("a3b2",8)
("a1c1",8)
("a1c2",9)
("a1c3",10)
("a2c1",9)
("a2c2",10)
("a2c3",11)
("a3c1",10)
("a3c2",11)
("a3c3",12)
("a1d1",11)
("a1d2",12)
("a1d3",13)
("a2d1",12)
("a2d2",13)
("a2d3",14)
("a3d1",13)
("a3d2",14)
("a3d3",15)
("b1c1",11)
("b1c2",12)
("b1c3",13)
("b2c1",12)
("b2c2",13)
("b2c3",14)
("b1d1",14)
("b1d2",15)
("b1d3",16)
("b2d1",15)
("b2d2",16)
("b2d3",17)
("c1d1",17)
("c1d2",18)
("c1d3",19)
("c2d1",18)
("c2d2",19)
("c2d3",20)
("c3d1",19)
("c3d2",20)
("c3d3",21)
("a1b1c1",12)
("a1b1c2",13)
("a1b1c3",14)
("a1b2c1",13)
("a1b2c2",14)
("a1b2c3",15)
("a2b1c1",13)
("a2b1c2",14)
("a2b1c3",15)
("a2b2c1",14)
("a2b2c2",15)
("a2b2c3",16)
("a3b1c1",14)
("a3b1c2",15)
("a3b1c3",16)
("a3b2c1",15)
("a3b2c2",16)
("a3b2c3",17)
("a1b1d1",15)
("a1b1d2",16)
("a1b1d3",17)
("a1b2d1",16)
("a1b2d2",17)
("a1b2d3",18)
("a2b1d1",16)
("a2b1d2",17)
("a2b1d3",18)
("a2b2d1",17)
("a2b2d2",18)
("a2b2d3",19)
("a3b1d1",17)
("a3b1d2",18)
("a3b1d3",19)
("a3b2d1",18)
("a3b2d2",19)
("a3b2d3",20)
("a1c1d1",18)
("a1c1d2",19)
("a1c1d3",20)
("a1c2d1",19)
("a1c2d2",20)
("a1c2d3",21)
("a1c3d1",20)
("a1c3d2",21)
("a1c3d3",22)
("a2c1d1",19)
("a2c1d2",20)
("a2c1d3",21)
("a2c2d1",20)
("a2c2d2",21)
("a2c2d3",22)
("a2c3d1",21)
("a2c3d2",22)
("a2c3d3",23)
("a3c1d1",20)
("a3c1d2",21)
("a3c1d3",22)
("a3c2d1",21)
("a3c2d2",22)
("a3c2d3",23)
("a3c3d1",22)
("a3c3d2",23)
("a3c3d3",24)
("b1c1d1",21)
("b1c1d2",22)
("b1c1d3",23)
("b1c2d1",22)
("b1c2d2",23)
("b1c2d3",24)
("b1c3d1",23)
("b1c3d2",24)
("b1c3d3",25)
("b2c1d1",22)
("b2c1d2",23)
("b2c1d3",24)
("b2c2d1",23)
("b2c2d2",24)
("b2c2d3",25)
("b2c3d1",24)
("b2c3d2",25)
("b2c3d3",26)
("a1b1c1d1",22)
("a1b1c1d2",23)
("a1b1c1d3",24)
("a1b1c2d1",23)
("a1b1c2d2",24)
("a1b1c2d3",25)
("a1b1c3d1",24)
("a1b1c3d2",25)
("a1b1c3d3",26)
("a1b2c1d1",23)
("a1b2c1d2",24)
("a1b2c1d3",25)
("a1b2c2d1",24)
("a1b2c2d2",25)
("a1b2c2d3",26)
("a1b2c3d1",25)
("a1b2c3d2",26)
("a1b2c3d3",27)
("a2b1c1d1",23)
("a2b1c1d2",24)
("a2b1c1d3",25)
("a2b1c2d1",24)
("a2b1c2d2",25)
("a2b1c2d3",26)
("a2b1c3d1",25)
("a2b1c3d2",26)
("a2b1c3d3",27)
("a2b2c1d1",24)
("a2b2c1d2",25)
("a2b2c1d3",26)
("a2b2c2d1",25)
("a2b2c2d2",26)
("a2b2c2d3",27)
("a2b2c3d1",26)
("a2b2c3d2",27)
("a2b2c3d3",28)
("a3b1c1d1",24)
("a3b1c1d2",25)
("a3b1c1d3",26)
("a3b1c2d1",25)
("a3b1c2d2",26)
("a3b1c2d3",27)
("a3b1c3d1",26)
("a3b1c3d2",27)
("a3b1c3d3",28)
("a3b2c1d1",25)
("a3b2c1d2",26)
("a3b2c1d3",27)
("a3b2c2d1",26)
("a3b2c2d2",27)
("a3b2c2d3",28)
("a3b2c3d1",27)
("a3b2c3d2",28)
("a3b2c3d3",29)