如何提取位于偶数位置的Haskell列表的元素

时间:2017-09-18 16:08:36

标签: list haskell

Hello亲爱的社区,

我想获得列表中偶数位置的所有元素。它是用于实施Dart游戏的。

e.g。 [((3,20),(1,19),(2,17)),((3,20),(2,12),(2,19))] -> [((3,20),(1,19),(2,17))]

到目前为止,我已尝试过:

positioneven n [] = []
positioneven n (x:xs) = if even n
                          then (x: positioneven n+1 xs)
                          else     positioneven n+1 xs

但这当然没有用。如果有人能给我一个更好的解决方案,我会很高兴的。

谢谢!纳扎尔

3 个答案:

答案 0 :(得分:12)

一个价格的两个有用功能:

evens (x:xs) = x:odds xs
evens _ = []

odds (_:xs) = evens xs
odds _ = []

答案 1 :(得分:5)

我们可以构造一个函数even_elem :: [a] -> [a],它当然是一个空列表的基础:

even_elem [] = []

此外,如果我们传递一个包含一个元素的列表,我们将返回包含该元素的列表:

even_elem [x] = [x]

最后,如果我们有一个包含两个或更多元素(x1:x2:t)的列表,我们会发出第一个元素x1并在尾t上执行递归:

even_elem (x1:_:t) = x1 : even_elem t

或将它们放在一起:

even_elem :: [a] -> [a]
even_elem [] = []
even_elem [x] = [x]
even_elem (x1:_:t) = x1 : even_elem t

如果我们通过重新排序模式假设[]的定义永远不会改变,我们可以简化这一点:

even_elem :: [a] -> [a]
even_elem (x1:_:t) = x1 : even_elem t
even_elem l = l

答案 2 :(得分:1)

您也可以foldrzip一样使用

evens :: [a] -> [a]    
evens = foldr (\t r -> if fst t `mod` 2 == 0 then snd t : r else r) [] . (zip [0..])