Haskell ';多重声明';使用通配符进行模式匹配时出错

Haskell ';多重声明';使用通配符进行模式匹配时出错,haskell,pattern-matching,wildcard,Haskell,Pattern Matching,Wildcard,出于学习目的,我正在尝试编写自己的zipWith函数实现。但是,我遇到了一个问题,即使用\uuu对边缘案例进行模式匹配。首先我将描述好的案例,然后是坏的案例。希望有人能解释为什么他们的行为不同。谢谢 如果我按如下方式编写zipWith函数,它会工作(注意第2行和第3行中与空列表匹配的边缘案例的顺序):- 在GHCI中编译:- ghci> :l ZipWith.hs [1 of 1] Compiling Main ( ZipWith.hs, interpreted

出于学习目的,我正在尝试编写自己的
zipWith
函数实现。但是,我遇到了一个问题,即使用
\uuu
对边缘案例进行模式匹配。首先我将描述好的案例,然后是坏的案例。希望有人能解释为什么他们的行为不同。谢谢

如果我按如下方式编写
zipWith
函数,它会工作(注意第2行和第3行中与空列表匹配的边缘案例的顺序):-

在GHCI中编译:-

ghci> :l ZipWith.hs 
[1 of 1] Compiling Main             ( ZipWith.hs, interpreted )
ZipWith.hs:4:0:
    Multiple declarations of `Main.zipWith''
    Declared at: ZipWith.hs:2:0
                 ZipWith.hs:4:0
Failed, modules loaded: none.
好的,上面的情况很好,但是如果我将模式匹配替换为GHCI周围的边缘情况,则会对第2行和第4行抛出“多个声明”错误

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith' _ _ [] = []
zipwith' _ [] _ = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys
在GHCI中编译:-

ghci> :l ZipWith.hs 
[1 of 1] Compiling Main             ( ZipWith.hs, interpreted )
ZipWith.hs:4:0:
    Multiple declarations of `Main.zipWith''
    Declared at: ZipWith.hs:2:0
                 ZipWith.hs:4:0
Failed, modules loaded: none.
我被难住了

  • 从第2行和第4行的模式来看,它们似乎相互排斥,但我显然遗漏了一些基本的东西
  • 为什么切换第2行和第3行的模式会导致编译错误消失

  • 错误消息并不是抱怨模式重叠(在两个空列表的情况下,您的模式确实重叠,但这不是问题,也不是问题),而是对
    zipWith
    函数的多个定义


    原因是,在第二种情况下,您有一个
    zipWith
    的定义,后面是一个不相关的
    zipWith
    (注意小写的
    w
    ),后面是一个新的、冲突的
    zipWith
    定义。换句话说,这是一个简单的打字错误。(确实花了我一段时间才看出来——真是一个鬼鬼祟祟的打字错误)

    哦,天哪,打字错误对我来说太尴尬了,谢谢你发现了它,还解释了我对错误的错误解释。+1表示Q和a。肯定有人会在谷歌上搜索这个问题,并希望看到这个答案。他们真的应该添加类似“可能是打字错误”的内容返回错误消息。