简体   繁体   中英

Haskell- looping every second element of list

I want to be able to loop every second element of a given list. I can do this recursively as so:

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

But the problem is that I need a function that accepts a list as parameter, then returns a list consisting of only every second element in the list, starting with (and including) the first element of the list, and I do not think this is possible recursively.

Can someone show me how to this using list comprehension? This would probably be the best approach.

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

List comprehension may not be useful.

You can also try mutual recursion

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

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

such as

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

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

One of the Haskellish approaches would be something with map , filter , and zip .

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

If you really wanted to use list comprehension, you could use the parallel list comprehension extension.

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

I think that the former is concise, though.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM