我有一个包含两个数字列表的元组 - ([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 I编译为类型不匹配错误时。
tupSums :: Num a => [[a]] -> [a]
tupSums = map sum . transpose
我对使用Haskell相当陌生,所以我不太了解我遇到的错误,如果这个问题看起来很愚蠢,那就很抱歉。
答案 0 :(得分:10)
这是zipWith
的一个很好的候选者,它采用两个列表并使用特定的运算符组合列表中的相应元素。以下应该有效:
tupSums :: Num a => ([a],[a]) -> [a]
tupSums = uncurry $ zipWith (+)
zipWith (+)
求值为一个带有两个参数的函数,每个参数都是列表,并返回一对成对的列表。 uncurry
采用两个args的函数并将其转换为一个带有单个元组的函数。所以uncurry $ zipWith (+)
求值为一个函数,它接受一个列表元组并返回一个带有成对和的列表。