Я начинающий Хаскелл. Предположим, что я хочу написать функцию convertKVList
, которая принимает плоский список пар ключ-значение, где некоторые из ключей могут быть повторены, и превращает их в сопоставление от ключей к спискам значений, где все ключи уникальны, Например, в списке пар Int
s, я хочу следующее:
> convertKVList [(1, 2), (1, 4), (1, 3), (2, 3)]
[(1,[3,4,2]),(2,[3])]
Это похоже на довольно общую задачу, что для выполнения того, что я хочу, должна быть библиотека, но я не мог найти ничего, когда смотрел. Наконец, кто-то предложил мне составить Map.toList
с Map.fromListWith (++)
, и я закончил с этим:
import Data.Map as Map (toList, fromListWith)
convertKVList :: (Ord a) => [(a, b)] -> [(a, [b])]
convertKVList ls =
(Map.toList . Map.fromListWith (++) . map (\(x,y) -> (x,[y]))) ls
Мой вопрос для более опытных Haskellers и состоит из двух частей: во-первых, это как вы это сделаете, или есть "лучший" (более простой для чтения или более эффективный или оба) способ?
Во-вторых, как я мог придумать это самостоятельно? Я знал, что хочу, чтобы тип был [(a, b)] -> [(a, [b])]
, но вложение в Google не помогло. И я просмотрел документы Data.Map
, но ни fromListWith
, ни toList
не выскочили как особенно полезные. Итак: как бы вы подумали об этой проблеме? (Я понимаю, что оба эти вопроса субъективны, особенно второй).
Спасибо!