需要获得下一个输入和输出:
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
答案 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
请注意我如何使用True
或False
值来跟踪要消除的值。如果为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]
我测试了你的例子并且有效。