Haskell-循环列表中的每一个元素



我希望能够循环给定列表的每一个元素。我可以递归地这样做:

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

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

有人能告诉我如何使用列表理解吗?这可能是最好的方法。

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

列表理解可能没有用处。

您也可以尝试相互递归

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]

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 ]

不过,我认为前者简明扼要。

最新更新