Haskell:如何在列表中显示损坏和配对索引中的所有元素?

时间:2015-10-11 01:26:52

标签: list haskell indexing

需要获得下一个输入和输出:

pospair [1, 3, 9, 2, 5, 7, 1, 11]
        [1, 9, 5, 1]

posimpair [1, 3, 9, 2, 5, 7, 1, 11]
          [3, 2, 7, 11]

这是获取指定索引上元素的方法:

show_in_index::Ord a=>[a]->Int->a
show_in_index l n = l!!n

它显示了这样的结果:

*Main> show_in_index [1,4,2,7,9] 3
7

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用递归:

pospair :: [a] -> [a]
pospair xs = aux xs [] True
    where
      aux [] acc _ = acc
      aux (y:ys) acc True = aux ys (acc ++ [y]) False
      aux (y:ys) acc False = aux ys acc True

请注意我如何使用TrueFalse值来跟踪要消除的值。如果为False,则不在acc(累加器)中包含该值。如果是True,我会包含该值。使用相同的想法,您可以实现posimpair

答案 1 :(得分:0)

您可以映射索引功能

对于pospair,以下作品:

map ([1, 3, 9, 2, 5, 7, 1, 11] !! ) [0,2..length [1, 3, 9, 2, 5, 7, 1, 11]-1]

对于posimpair,我们只需要更改第二个列表,即保存索引编号的列表,之前我们有一系列对,现在我们想要一系列的损坏,所以不要使用0,2,..直到列表的长度-1我们必须用1,3,...来完成,直到list-1的长度。

map ([1, 3, 9, 2, 5, 7, 1, 11] !! ) [1,3..length [1, 3, 9, 2, 5, 7, 1, 11]-1]

一般实施是

pospairs = map(list !!)[0,2..length list - 1]

posimpairs = map(list !!)[1,3..length list - 1]

我测试了你的例子并且有效。