如何在Haskell中根据列表中以前的值筛选列表元素



我正在Haskell中创建一个函数,该函数根据列表中前一个元素的条件过滤列表中的数字。

示例

前一个数字是2 的倍数

myFunction [1, 2, 5, 6, 3]
# expected output:
[5,3]

我知道如何应用filter,但到目前为止,我已经看到过滤器一次只接受一个参数。

我尝试过scanl1foldl1map,但我是Haskell的新手,一直没能做到;有线索吗?

编辑

应该是:

myFunction []       =  []
myFunction [x]      =  []
myFunction [x,y]    =  if (x `mod` 2) == 0 then [y] else []
myFunction (x:y:xs) =  if (x `mod` 2) == 0 
then y : (myFunction xs)
else myFunction (y:xs)

因为对于输入:

myFuntion [1, 2, 5, 6, 3]

正确的输出应该是:

[5,3]

如果您更喜欢使用库函数,在这种情况下有一个已知的技巧,那就是用自己的尾部压缩输入,即初始列表减去第一个元素。

λ> 
λ> inls = [1, 2, 5, 6, 3]
λ> 
λ> let pairs = zip (tail inls) inls
λ> pairs
[(2,1),(5,2),(6,5),(3,6)]
λ> 

并且所得到的配对列表是CCD_ 5和CCD_。如:

λ> let myFunction ls = let pairs = zip (tail ls) ls  in  map fst $ filter (even . snd) pairs
λ> 
λ> ls
[1,2,5,6,3]
λ> 
λ> myFunction ls
[5,3]
λ> 

最新更新