我正在Haskell中创建一个函数,该函数根据列表中前一个元素的条件过滤列表中的数字。
示例
前一个数字是2 的倍数
myFunction [1, 2, 5, 6, 3]
# expected output:
[5,3]
我知道如何应用filter
,但到目前为止,我已经看到过滤器一次只接受一个参数。
我尝试过scanl1
、foldl1
和map
,但我是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]
λ>