Функция GroupBy из .NET в Haskell

Библиотека LINQ в .NET framework действительно имеет очень полезную функцию, которая называется ] GroupBy , которую я использую все время. Его тип в Haskell будет выглядеть как

Ord b => (a-> b) -> [a] -> [(b, [a])]

Его цель - классифицировать элементы на основе заданной функции классификации f по сегментам, причем каждое ведро содержит похожие элементы, то есть (b, l) , так что для любого элемента x в l , fx == 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 l@((k,_):_) = (k, map snd l)

Это определенно не то, что я хочу видеть среди моего кода, специфичного для проблемы.

Мой вопрос: как я могу реализовать эту функцию, хорошо используя стандартные библиотеки для их максимум?

Кроме того, кажущееся отсутствие такой стандартной функции намекает на то, что она может редко понадобиться опытным хаскеллерам, потому что они могут знать какой-то лучший способ. Это правда? Что можно использовать для более эффективной реализации аналогичных функций?

Кроме того, какое хорошее название было бы для этого, учитывая, что groupBy уже занято? :)

9
задан Rotsor 27 May 2011 в 10:59
поделиться