所以我正在尝试编写一个函数,在给定两个整数列表的情况下,将每个列表的第 i 个偶数相加并在另一个列表中返回它们。如果列表之一没有第 i 个偶数,则考虑 0。例如,如果列表是 [1,2,1,4,6] 和 [2,2],则返回 [4,6,6] ([2+2,4+2,6+0])。我有以下代码:
addEven :: [Int] -> [Int] -> [Int]
addEeven [] [] = []
addEeven (x:xs) [] = filter (\g -> g `mod`2 == 0) (x:xs)
addEven [] (y:ys) = filter (\g -> g `mod` 2 == 0) (y:ys)
addEven (x:xs) (y:ys) = (a + b):(addEven as bs)
where
(a:as) = filter (\g -> g `mod` 2 == 0) (x:xs)
(b:bs) = filter (\g -> g `mod` 2 == 0) (y:ys)
当我用前面的例子运行它时,我得到:
[4,6*** Exception: ex.hs:(4,1)-(8,101): Non-exhaustive patterns in function addEven
我真的看不出我错过了什么,因为它不适用于我投入的任何输入。
最佳答案
A filter
可能会消除元素,因此 filter (\g -> g
模组 2 == 0)
据说不返回任何元素,因此模式 (a:as)
和 (b:bs)
可能会失败。
话虽如此,我认为你在这里把问题弄得太复杂了。您可以首先定义一个辅助函数来添加列表的两个元素:
addList :: Num a => [a] -> [a] -> [a]
addList (x:xs) (y:ys) = (x+y) : addList xs ys
addList xs [] = xs
addList [] ys = ys
然后我们对这两个参数做过滤,做一个函数
addEven
看起来像:addEven :: Integral a => [a] -> [a] -> [a]
addEven xs ys = addList (filter even xs) (filter even ys)
或与
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
:import Data.Function(on)
addEven :: Integral a => [a] -> [a] -> [a]
addEven = addList `on` filter even
关于Haskell - 由于我不明白的原因,非穷举模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59347803/