group by key in haskell
更新日期:
什麼是Group By Key
Group By Key 就是把Element 計算一個key,相同key的element 就放左一組內
例如group by key by the reminder equal to 3 in Scala
1 | val arr = Array(2, 4, 5, 6, 9, 23, 24, 25, 31, 37) |
問題
Haskell 中把 List 中的element Group By Key 是麻煩的一件事
因為Data.List.groupBy
是linear scan 每兩個element, 然後比較他們是否相同
1 | import Data.List |
解決方法1
List 事前需要被sorted by key
Scala 的例子在Haskell 可以寫成這樣
值得注意sortBy
要求data Ordering
, 需要用compare
, 不是Bool結果的>
==
<
1 | Prelude Data.List> let allInOne = groupBy (\x y -> (x `mod` 3) == (y `mod` 3)) . sortBy (\x y -> compare (x `mod` 3) (y `mod` 3)) |
解決方法2
一個package解決這個問題, 當中的groupBy
是scala中的`groupByKey 但return 一個List
安裝1
2
3> cabal install utility-ht
> ......
> ghci
例子1
2
3
4Prelude> import Data.List.HT
Prelude Data.List.HT> let a = [2, 4, 5, 6, 9, 23, 24, 25, 31, 37]
Prelude Data.List.HT> groupBy (\x y -> x `mod` 3 == y `mod` 3 )
[[2],[4],[5],[6,9],[23],[24],[25,31,37]]