Haskell-循环列表的每个第二个元素

时间:2015-02-19 00:35:33

标签: list haskell list-comprehension

我希望能够遍历给定列表的每个第二个元素。我可以这样递归地执行此操作:

check validate (x:xs) = check (validate x) (tail xs)

但问题是我需要一个接受列表作为参数的函数,然后返回一个列表,该列表仅包含列表中的每个第二个元素,从(并包括)列表的第一个元素开始,而我不是认为这可能是递归的。

有人可以使用列表理解向我展示如何使用列表理解吗?这可能是最好的方法。

3 个答案:

答案 0 :(得分:6)

second (x:y:xs) = y : second xs;
second _ = []

列表理解可能没用。

答案 1 :(得分:3)

您也可以尝试相互递归

first [] = []
first (x:xs) = x:second xs

second [] = []
second (x:xs) = first xs

,例如

> first [1..10]
[1,3,5,7,9]

> second [1..10]
[2,4,6,8,10]

答案 2 :(得分:2)

其中一种Haskellish方法是mapfilterzip

second xs = map fst $ filter (odd . snd) $ zip xs [1..]

如果您真的想使用列表推导,可以使用并行列表推导扩展。

{-# LANGUAGE ParallelListComp #-}
second xs = [ x | (x, n) <- [ (x, n) | x <- xs | n <- [1..] ], odd n ]

我认为前者简洁明了。