Haskell统计String中Char出现次数时模式匹配报错如何解决?
问题原因
Haskell 语法不允许模式匹配中重复使用同一个变量名(即不支持非线性模式),你代码中第二行howMany a (a : xs)里两次出现的a会被判定为重复定义变量,直接触发编译报错,无法通过重名变量隐式判断两个值是否相等。
修复方案
你需要显式对列表首元素和目标字符做相等性判断,可以用守卫语法简化逻辑,修改后的代码如下:
howMany :: Char -> String -> Int howMany a [] = 0 howMany a (x : xs) | x == a = 1 + howMany a xs | otherwise = howMany a xs
也可以用条件表达式实现相同逻辑:
howMany :: Char -> String -> Int howMany a [] = 0 howMany a (x : xs) = (if x == a then 1 else 0) + howMany a xs
两种写法逻辑完全一致:遇到空字符串直接返回0,非空时先判断首字符是否是目标字符,匹配则计数加1,否则不加,再递归统计剩余字符串的字符出现次数。
内容的提问来源于stack exchange,提问作者123
相关产品推荐
相关产品推荐

