.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