gpt4 book ai didi

haskell - 按函数值分组到 Multimap

转载 作者:行者123 更新时间:2023-12-04 01:39:45 29 4
gpt4 key购买 nike

假设我有一个这样的值列表:

["abc","abd","aab","123"]

我想通过使用将任何元素映射到键的函数将这些值分组到 Haskell 中的 MultiMap(概念上,不限于特定的数据结构)。

对于这个例子,我们将使用take 2作为映射器。

我打算得到的结果是(概念上,作为 JSON):

{"ab":["abc","abd"], "aa":["aab"], "12":["123"]}

在此示例中,我将使用 [(String, [String])] 作为 Multimap 数据结构。

我的基本想法(概念上):

let datalist = ["abc","abd","aab","123"]
let mapfn = take 2
let keys = nub $ map mapfn datalist
let valuesForKey key = filter ((==key).mapfn) datalist
let resultMultimap = zip keys $ map valuesForKey keys

我的问题:

  1. 有没有更好的方法(在基础包或外部包中)来做到这一点?我想避免自定义代码。
  2. 如果 1) 不适用,是否可以保证 GHC 会对此进行优化,以便遍历数据列表一次就足以生成完整的多重映射(而不是每个键运行一次 filter) ?

从概念上讲,这道题类似于SQL的GROUP BY语句。

最佳答案

使用 fromListWith来自 Data.Map :

> let xs = ["abc","abd","aab","123"]
> let f = take 2
> Data.Map.fromListWith (++) [(f x, [x]) | x <- xs]
fromList [("12",["123"]),("aa",["aab"]),("ab",["abd","abc"])]

关于haskell - 按函数值分组到 Multimap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22026800/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com