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.
我被难住了
错误消息并不是抱怨模式重叠(在两个空列表的情况下,您的模式确实重叠,但这不是问题,也不是问题),而是对
zipWith
函数的多个定义
原因是,在第二种情况下,您有一个
zipWith
的定义,后面是一个不相关的zipWith
(注意小写的w
),后面是一个新的、冲突的zipWith
定义。换句话说,这是一个简单的打字错误。(确实花了我一段时间才看出来——真是一个鬼鬼祟祟的打字错误)哦,天哪,打字错误对我来说太尴尬了,谢谢你发现了它,还解释了我对错误的错误解释。+1表示Q和a。肯定有人会在谷歌上搜索这个问题,并希望看到这个答案。他们真的应该添加类似“可能是打字错误”的内容返回错误消息。