Fer*_*rry 7 haskell pattern-matching
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
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我得到这个输出:
Warning: Pattern match(es) are overlapped
Run Code Online (Sandbox Code Playgroud)
答案总是"0",这不是我的意图.代码有什么问题以及如何修复它?
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"
Run Code Online (Sandbox Code Playgroud)
该zipWith表达式生成一个列表,Bool其中列出True了每个差异.该函数fromEnum映射False到0和True到1.
按顺序尝试模式.您的第一个模式test'始终匹配,因此始终使用该大小写.第一种情况应该是
test' "" "" n = n
Run Code Online (Sandbox Code Playgroud)
代替.
| 归档时间: |
|
| 查看次数: |
9111 次 |
| 最近记录: |