我试图使用列表理解来取出所有其他元素(从列表中的第一个元素开始),但我遇到了一个问题 - 这就是我想要做的事情
evother :: [a]-> Int ->[a]
evother lst q = [x | x <- lst, even( q++ ) ]
我想要做的是每次评估偶数时将一个变量q递增1(这将有助于我获得所需的列表)。显然这不起作用,因为q ++是不被允许的 - 我的替代方案是什么?
例如,如果我打电话:evother [&#39; a&#39;&#39; b&#39;&#39; c&#39;] 1,则偶数(2)为True且第一个元素(a)被挑出,第二个元素&#39; b&#39;不会被选中,因为即使(3)是假的,最后也是&#39; c&#39;将被挑选出来给我们列表[&#39; a&#39;&#39; b&#39;]
答案 0 :(得分:2)
列表理解
evother xs = [x | (x,i) <- zip xs [1..], even i]
> evother [1..10]
[2,4,6,8,10]
你可以跳过列表理解用zip和过滤器添加索引
evother = map snd . filter (even . fst) . zip [1..]
> evother [1..10]
[2,4,6,8,10]
从描述中不清楚你要过滤哪些元素,所以你可以概括一点
evother f = map snd . filter (f . fst) . zip [1..]
> evother even [1..10]
[2,4,6,8,10]
> evother odd [1..10]
[1,3,5,7,9]
但是,更好的解决方案是使用相互递归
first, second :: [a] -> [a]
first [] = []
first (x:xs) = x:second xs
second [] = []
second (x:xs) = first xs
> first [1..10]
[1,3,5,7,9]
> second [1..10]
[2,4,6,8,10]
答案 1 :(得分:0)
我认为@karakfa可能有正确的答案,但这里有一个使用列表理解(注意我翻了拉链)。
evother :: [a] -> Int -> [a]
evother lst q = [ x | (x,y) <- zip lst [q..], even( y ) ]