Haskell- 循环列表的每个第二个元素
Haskell- looping every second element of list
我希望能够循环给定列表的每个第二个元素。我可以这样递归地执行此操作:
check validate (x:xs) = check (validate x) (tail xs)
但问题是我需要一个接受列表作为参数的函数,然后 returns 一个仅由列表中的第二个元素组成的列表,从第一个元素开始(并包括)列表,我不认为这是可能的递归。
谁能告诉我如何使用列表推导来做到这一点?这可能是最好的方法。
second (x:y:xs) = y : second xs;
second _ = []
列表理解可能没有用。
Haskellish 方法之一是 map
、filter
和 zip
。
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 ]
不过我觉得前者比较简洁
你也可以试试互递归
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]
我希望能够循环给定列表的每个第二个元素。我可以这样递归地执行此操作:
check validate (x:xs) = check (validate x) (tail xs)
但问题是我需要一个接受列表作为参数的函数,然后 returns 一个仅由列表中的第二个元素组成的列表,从第一个元素开始(并包括)列表,我不认为这是可能的递归。
谁能告诉我如何使用列表推导来做到这一点?这可能是最好的方法。
second (x:y:xs) = y : second xs;
second _ = []
列表理解可能没有用。
Haskellish 方法之一是 map
、filter
和 zip
。
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 ]
不过我觉得前者比较简洁
你也可以试试互递归
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]