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
但这当然没有用。如果有人能给我一个更好的解决方案,我会很高兴的。
谢谢!纳扎尔
答案 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)
您也可以foldr
与zip
一样使用
evens :: [a] -> [a]
evens = foldr (\t r -> if fst t `mod` 2 == 0 then snd t : r else r) [] . (zip [0..])