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

Mos*_*a_M 4 haskell list

你好亲爱的社区,

我想获得列表中偶数位置的所有元素.这是为了实施Dart游戏.

例如 [((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
Run Code Online (Sandbox Code Playgroud)

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

谢谢 !纳扎尔

n. *_* m. 12

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

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

odds (_:xs) = evens xs
odds _ = []
Run Code Online (Sandbox Code Playgroud)


Wil*_*sem 5

我们可以构造一个even_elem :: [a] -> [a]以空列表为基础的函数:

even_elem [] = []
Run Code Online (Sandbox Code Playgroud)

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

even_elem [x] = [x]
Run Code Online (Sandbox Code Playgroud)

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

even_elem (x1:_:t) = x1 : even_elem t
Run Code Online (Sandbox Code Playgroud)

或者把它放在一起:

even_elem :: [a] -> [a]
even_elem [] = []
even_elem [x] = [x]
even_elem (x1:_:t) = x1 : even_elem t
Run Code Online (Sandbox Code Playgroud)

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

even_elem :: [a] -> [a]
even_elem (x1:_:t) = x1 : even_elem t
even_elem l = l
Run Code Online (Sandbox Code Playgroud)