2011-10-04 45 views
7
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 

当我编译,我得到这样的输出:哈斯克尔 - 模式匹配(ES)重叠

Warning: Pattern match(es) are overlapped 

得到的答复永远是“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每差。功能fromEnumFalse映射到0True1

+0

非常有帮助!我学到了很多!谢谢 – Ferry

7

模式按顺序尝试。 test'的第一个模式始终匹配,因此总是使用该情况。第一种情况应该可能是

test' "" "" n = n 

改为。