Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. dic = [(1,"aa"),(1,"cc"),(2,"aa"),(3,"ff"),(3,"gg"),(1,"bb")]
  2.  
  3. grp = [(1,["aa","bb","cc"]), (2, ["aa"]), (3, ["ff","gg"])]
  4.  
  5. import Data.Function (on)
  6. import Data.List (sortBy, groupBy)
  7. import Data.Ord (comparing)
  8.  
  9. myGroup :: (Eq a, Ord a) => [(a, b)] -> [(a, [b])]
  10. myGroup = map (l -> (fst . head $ l, map snd l)) . groupBy ((==) `on` fst)
  11. . sortBy (comparing fst)
  12.  
  13. [(1,"aa"),(1,"cc"),(2,"aa"),(3,"ff"),(3,"gg"),(1,"bb")]
  14. => [(1,"aa"),(1,"bb"),(1,"cc"),(2,"aa"),(3,"ff"),(3,"gg")]
  15.  
  16. [(1,"aa"),(1,"bb"),(1,"cc"),(2,"aa"),(3,"ff"),(3,"gg")]
  17. => [[(1,"aa"),(1,"bb"),(1,"cc")],[(2,"aa")],[(3,"ff"),(3,"gg")]]
  18.  
  19. [[(1,"aa"),(1,"bb"),(1,"cc")],[(2,"aa")],[(3,"ff"),(3,"gg")]]
  20. => [(1,["aa","bb","cc"]), (2, ["aa"]), (3, ["ff","gg"])]`)
  21.  
  22. > myGroup dic
  23. [(1,["aa","bb","cc"]),(2,["aa"]),(3,["ff","gg"])]
  24.  
  25. import Data.Map
  26. sortAndGroup assocs = fromListWith (++) [(k, [v]) | (k, v) <- assocs]
  27.  
  28. *Main> sortAndGroup [(1,"aa"),(1,"cc"),(2,"aa"),(3,"ff"),(3,"gg"),(1,"bb")]
  29. fromList [(1,["bb","cc","aa"]),(2,["aa"]),(3,["gg","ff"])]
  30.  
  31. Prelude> :set -XTransformListComp
  32. Prelude> import GHC.Exts (groupWith, the)
  33. Prelude GHC.Exts> let dic = [ (1, "aa"), (1, "bb"), (1, "cc") , (2, "aa"), (3, "ff"), (3, "gg")]
  34. Prelude GHC.Exts> [(the key, value) | (key, value) <- dic, then group by key using groupWith]
  35. [(1,["aa","bb","cc"]),(2,["aa"]),(3,["ff","gg"])]
  36.  
  37. grp :: Eq a => [(a,b)] -> [(a,[b])]
  38. grp = foldr f []
  39. where
  40. f (z,s) [] = [(z,[s])]
  41. f (z,s) a@((x,y):xs) | x == z = (x,s:y):xs
  42. | otherwise = (z,[s]):a
  43.  
  44. grp [] = []
  45. grp ((a, b): xs) = (a, b : map snd forthis) : grp rest where
  46. (forthis, rest) = partition ((== a) . fst) xs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement