test :: String -> String -> Int
test' x y n = n
test' "" (y:ys) n = error "error"
test' (x:xs) "" n = error "error"
test' (x:xs) (y:ys) n =
if x == y
then test' xs ys n
else test' xs ys (n+1)
test a b = test' a b 0
当我编译它时,我得到了这个输出:
Warning: Pattern match(es) are overlapped
答案总是“0”,这不是我想要的。代码有什么问题以及如何修复它?
答案 0 :(得分:9)
test' x y n = n
将匹配每次通话,其他模式将不予考虑。我认为这种情况应该是test' "" "" n = n
。如果你在结束移动原始行(当所有其他情况都失败时),你会得到相同的结果,但是你应该写test' _ _ n = n
,这表明你故意忽略了一些参数。
<强> [编辑] 强>
更短的解决方案是:
test a b | length a == length b = sum $ map fromEnum $ zipWith (/=) a b
| otherwise = error "error"
zipWith
表达式会为每个差异生成Bool
列表True
。函数fromEnum
将False
映射到0
,将True
映射到1
。
答案 1 :(得分:7)
按顺序尝试模式。 test'
的第一个模式始终匹配,因此始终使用该大小写。第一种情况应该是
test' "" "" n = n
代替。