Haskell编程求助:实现列表偶数索引元素提取及odds函数
解决Haskell中evens和odds函数的实现问题
你的代码里xs !! 2n是语法错误,而且列表推导式没法直接这么获取索引。要定位元素的索引,得把元素和它的索引配对,用zip [0..]就能给列表里每个元素绑定从0开始的索引值。
修正后的evens函数
要返回偶数索引(0、2、4...)的元素,我们可以用列表推导式结合zip来筛选:
evens :: [a] -> [a] evens xs = [x | (x, idx) <- zip xs [0..], even idx]
这里zip xs [0..]把每个元素和它的索引打包成元组,然后我们只保留索引为偶数的元素。
实现odds函数
odds函数要返回剩余的奇数索引(1、3、5...)元素,有两种实现方式:
方式一:独立实现列表推导式
和evens逻辑类似,只是筛选索引为奇数的元素:
odds :: [a] -> [a] odds xs = [x | (x, idx) <- zip xs [0..], odd idx]
方式二:基于已实现的evens函数
原列表的奇数索引元素,去掉第一个元素后,它们的索引就变成了新列表的偶数索引。所以可以直接复用evens函数:
odds :: [a] -> [a] odds xs = evens (tail xs)
测试示例
-- 测试evens evens [1,2,3,4,5] -- 结果:[1,3,5] evens ["apple", "banana", "cherry"] -- 结果:["apple", "cherry"] -- 测试odds odds [1,2,3,4,5] -- 结果:[2,4] odds ["apple", "banana", "cherry"] -- 结果:["banana"]
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

