我有一个元组列表,例如:
[(1,2), (3,4), (5,6)]
现在我必须编写函数,它总结每个元组的第一个元素,并创建这些值的列表。
对于上面的示例,它应该是:
[3, 7, 11]
这应该使用列表理解来完成。不允许使用地图,过滤器和联系人等功能。
我有什么想法可以访问列表中元组的元素吗?
答案 0 :(得分:2)
试试这个:
[ x + y | (x,y) <- yourlist]
诀窍是将输入列表中的元组中的两个元素表示为x
和y
,然后根据需要处理它们。
答案 1 :(得分:1)
让我们使用Prelude:
中的函数,在没有列表推导的情况下完成map (uncurry (+)) [(1,2), (3,4), (5,6)]
-- Result: [3, 7, 11]
这是如何工作的?让我们考虑一下类型:
(+) :: Num a => a -> a -> a
uncurry :: (a -> b -> c) -> (a, b) -> c
map :: (a -> b) -> [a] -> [b]
正如您可能已经知道的那样,在Haskell中,执行多参数函数的常规方法是通过* currying *它们。 (+)
的类型反映了这一点:从概念上讲,它需要一个参数并生成一个函数,然后使用“第二个”参数来生成最终结果。
uncurry
采用这样一个curried的双参数函数,并使其适应于一对。实施起来很简单:
uncurry :: (a -> b -> c) -> (a, b) -> c
uncurry f (a, b) = f a b
有趣的是,uncurry
函数是curry,因此其部分应用uncurry (+)
的类型为Num a => (a, a) -> a
。这将是一个带有一对数字并添加它们的函数。
map
只是将一个函数应用于列表的每个元素,将各个结果收集到一个列表中。将它们全部插在一起,这是一个解决方案。