.NET框架中的LINQ庫確實有一個非常有用的函數GroupBy,我一直在使用它。 其在Haskell類型會是什麼樣子GroupBy函數來自Haskell中的.NET
Ord b => (a-> b) -> [a] -> [(b, [a])]
其目的是基於給定的分類功能f
項目分爲桶,與含有類似的項目每個桶,這是(b, l)
使得對於l
任何項目x
, f x == b
。它在.NET中的性能是O(N),因爲它使用散列表,但在Haskell中,我確定O(N * log(N))。
我在標準的Haskell庫中找不到類似的東西。另外,我的標準功能方面實現多少有些笨重:
myGroupBy :: Ord k => (a -> k) -> [a] -> [(k, [a])]
myGroupBy f = map toFst
. groupBy ((==) `on` fst)
. sortBy (comparing fst)
. map (\a -> (f a, a))
where
toFst [email protected]((k,_):_) = (k, map snd l)
這絕對不是我想看到我之間特定問題的代碼。
我的問題是:我怎樣才能實現這個功能很好地利用標準庫到他們最大?
此外,似乎沒有這樣的標準功能暗示它可能很少有經驗的Haskellers需要,因爲他們可能知道一些更好的方法。真的嗎?什麼可以用來以更好的方式實現類似的功能?
另外,考慮到groupBy
已經採取了什麼名稱呢? :)
及其在Haskell類型是'奧德B =>(A-> B) - >並[a] - > [(二,[a])]' – 2011-05-27 09:26:48
噢,我的...而且沒有人注意到! – Rotsor 2011-05-27 10:59:06