gpt4 book ai didi

list - 如何将一个列表压缩到另一个嵌套在 Haskell 中的列表上?

转载 作者:行者123 更新时间:2023-12-04 14:58:21 25 4
gpt4 key购买 nike

所以,这里有一个类型定义,只是为了某些上下文:

type Name = String
type Coordinates = (Int, Int)
type Pop = Int
type TotalPop = [Pop]
type City = (Name, (Coordinates, TotalPop))

这是一个数据集:

testData :: [City]
testData = [("New York City", ((1,1), [5, 4, 3, 2])),
("Washingotn DC", ((3,3), [3, 2, 1, 1])),
("Los Angeles", ((2,2), [7, 7, 7, 5]))]

所以,我正在尝试创建一个函数 (addAllPops) 来编辑 [ 中所有 CityTotalPop City],并在 TotalPop 的开头添加一个新条目。我希望它以这样的方式工作,在下面的示例中,输入 addNewPop testData [6, 4, 8] 会将它们更改为:

"New York City", ((1,1), [6, 5, 4, 3, 2],
"Washingotn DC", ((3,3), [4, 3, 2, 1, 1],
"Los Angeles", ((2,2), [8, 7, 7, 7, 5]

只改变一个城市人口的功能在这里,连同我对整体的尝试,我最大的问题完全是将两个列表合并为一个。

addAllPops :: [City] -> [Int] -> [City]
addAllPops [(w, ((x,y), z))] pops = [map uncurry addPop (zip pops z)]

addPop :: City -> Int -> City
addPop (w, ((x,y), z)) p = (w, ((x,y), p:z))

我已经坚持了很长时间,非常感谢任何和所有的帮助:)

最佳答案

您从 addPop 开始的直觉是正确的。现在看一下 zipWith 的类型签名:

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

它采用逐点操作的函数并将其提升为并行操作两个列表。因此,您 zipWith 城市和新元素列表,使用 addPop 逐点组合它们:

addAllPops :: [City] -> [Int] -> [City]
addAllPops cities newPops = zipWith addPop cities newPops

我们可以通过 eta-contract 这个定义来得出非常简单的结论

addAllPops = zipWith addPop

您也可以使用 zipmap 来完成此操作,但它只是更多的管道。

关于list - 如何将一个列表压缩到另一个嵌套在 Haskell 中的列表上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67461458/

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