我是 Haskell 初学者。假设我想编写一个函数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])]
,但将其放入 Hoogle 并没有发现任何有用的东西。我看过Data.Map
文档,但都fromListWith
没有toList
特别有用。那么:您将如何思考这个问题?(我意识到这两个问题都是主观的,尤其是第二个问题。)
谢谢!