如何从列表中的索引中选择元组元素?

时间:2018-05-01 17:35:34

标签: list haskell tuples modulo

我希望从列表中选择元素,[[1,2],[3,4],[5,6]]一次是第一个,而不是第二个,而不是第一个,依此类推。 我想我可以使用zip在对前面添加一个计数器并使用modulo来选择部件,现在我的列表看起来像这样:

let a = [(0,[1,2]),(1,[3,4]),(2,[5,6]),(3,[7,8]),(4,[9,10])]

但我现在如何选择元素呢?

伪代码将是

for each tuple in list:
      first part of tuple is the selector, second part is the pair
      if selector mod 2 : choose pair[0] else choose pair[1]

列表a的输出应为:1,4,5,7,9

2 个答案:

答案 0 :(得分:6)

也许:

> zipWith (!!) [[1,2],[3,4],[5,6],[7,8],[9,10]] (cycle [0,1])
[1,4,5,8,9]

如果你知道你正在使用内部长度为2的列表,那么你可能应该使用对。

> zipWith ($) (cycle [fst, snd]) [(1,2),(3,4),(5,6),(7,8),(9,10)]
[1,4,5,8,9]

答案 1 :(得分:1)

我喜欢@DanielWagner回答很多。第一个是如此简单有效。他的第二个更难理解,但也很简单。当理论很简单时,它就会提高它们的准确性。这是我抱歉的解决方案,但它确实使用了您的结构。 (关联列表是元组。有人建议你使用元组,但为此,你拥有和可能需要的东西是可以的。)

a = [(0,[1,2]),(1,[3,4]),(2,[5,6]),(3,[7,8]),(4,[9,10])]

[if even i then x else y | (i,(x:y:z)) <- a]

[1,4,5,8,9]