Haskell - 由于我不明白的原因,非穷举模式

标签 haskell design-patterns functional-programming matching

所以我正在尝试编写一个函数,在给定两个整数列表的情况下,将每个列表的第 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/

相关文章:

haskell - Haskell:<*>的发音是什么?

haskell - 图层和可扩展效果之间有什么区别?

haskell - 在 Haskell 中导入时隐藏类型类实例声明

c# - 为 "character"设计一种干净/灵活的方式来在角色扮演游戏中施放不同的法术

functional-programming - 没有调用堆栈的架构中的尾部调用

javascript - FP 方式的数组嵌套映射

haskell - 为什么预定义的 `const` 函数在某些上下文中的行为与等效的 lambda 函数不同?

C++模式禁止在特定范围外实例化类?

JavaScript 模块模式——如何创建子模块

lambda - Java 8 中的 lambda 表达式如何支持函数式编程?