3

我有一个包含两个数字列表的元组 - ([1,2,3,4],[5,6,7,8])

我需要将每个列表中相应的数字对加在一起。即 (1+5)、(2+6) 等。输出列表即 [6,8,10,12]。它也应该适用于列表中的任何数量的元素(2 个 5 个列表、2 个 6 个列表等)。

我一直在尝试使用“map sum . transpose”的函数,但似乎无法获得正确的类型(因为它在元组中)。我在这里找到了一段代码,它适用于列表列表,但不知道如何对列表元组执行相同的操作(可能吗?)。当我尝试更改“a”的类型或使用 Int 时,我编译为类型不匹配错误。

tupSums :: Num a => [[a]] -> [a]
tupSums = map sum . transpose

我对使用 Haskell 还很陌生,所以我不太了解我遇到的错误,如果这个问题看起来很愚蠢,我很抱歉。

4

1 回答 1

10

这是一个很好的候选zipWith,它接受两个列表并使用特定的运算符组合列表中的相应元素。以下应该有效:

tupSums :: Num a => ([a],[a]) -> [a]
tupSums = uncurry $ zipWith (+)

zipWith (+)计算为一个接受两个参数的函数,每个参数都是列表,并返回成对和的列表。uncurry接受两个 args 的函数并将其转换为接受单个元组的函数。所以uncurry $ zipWith (+)计算一个函数,该函数接受一个列表元组并返回一个带有成对和的列表。

于 2013-02-14T00:35:38.987 回答