在Haskell中访问列表中元组的元素

时间:2014-05-13 16:31:32

标签: list haskell tuples

我有一个元组列表,例如:

[(1,2), (3,4), (5,6)]

现在我必须编写函数,它总结每个元组的第一个元素,并创建这些值的列表。

对于上面的示例,它应该是:

[3, 7, 11]

这应该使用列表理解来完成。不允许使用地图,过滤器和联系人等功能。

我有什么想法可以访问列表中元组的元素吗?

2 个答案:

答案 0 :(得分:2)

试试这个:

[ x + y | (x,y) <- yourlist]

诀窍是将输入列表中的元组中的两个元素表示为xy,然后根据需要处理它们。

答案 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只是将一个函数应用于列表的每个元素,将各个结果收集到一个列表中。将它们全部插在一起,这是一个解决方案。