如何删除 Haskell 中的偶数索引?

How to remove even indexes in Haskell?

函数式程序的新手,我需要从列表中删除索引元素,到目前为止我只能创建一个列表,从 1 到 n。 列表:[1,2,3,4,5,6...100] 目标:[1,3,5,7,9...99]

main = do
    input <- readLn :: IO Int
    let a = input 
    let list=[1..a] 
    putStrLn $ show list

您可以生成一个仅包含奇数元素的列表,方法是使用以 1 开头然后 3 和限制 a:

的范围
main = do
    input <- readLn :: IO Int
    print <strong>[1, 3..a]</strong>

这将调用 enumFromThenTo :: Enum a => a -> a -> a -> [a],从而生成一个包含两个步骤的列表。

你也可以做两个相互递归的函数:

evens :: [a] -> [a]
evens [] = []
evens (_:xs) = odds xs

odds :: [a] -> [a]
odds [] = []
odds (x:xs) = x : evens xs

然后在列表 [1 .. 100] 上调用 odds 会产生:

Prelude> odds [1 .. 100]
[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99]

evens可用于获取偶数索引上的元素。

用一个简单的示例列表稍微详细说明这种相互递归的样子:

odds [1, 4, 2, 7, 9, 6]
1 : evens [4, 2, 7, 9, 6]
1 : odds [4, 7, 9, 6]
1 : 2 : evens [7, 9, 6]
1 : 2 : odds [9, 6]
1 : 2 : 9 : evens [6]
1 : 2 : 9 : odds []
1 : 2 : 9 : []
[1, 2, 9]

或者如果你想删除偶数项(不是偶数索引),你可以使用:

Prelude> filter odd [1, 4 .. 100]
[1,7,13,19,25,31,37,43,49,55,61,67,73,79,85,91,97]