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