Haskell中getCount函数出现Non-exhaustive patterns错误求助
问题分析
你的代码报错是因为非穷尽模式匹配:getCount函数只定义了对非空字符串(x:xs)的处理逻辑,但没有处理空字符串""的情况。当测试用例传入空字符串(比如报错信息里的0对应的输入就是空字符串,因为空串的元音数量是0)时,没有对应的模式可以匹配,就会抛出PatternMatchFail异常。
Jupyter里没报错是因为你没测试空字符串的情况,并非代码本身没有问题。
修复后的代码
getCount :: String -> Int getCount "" = 0 getCount s = sum [1 | c <- s, check c] where check :: Char -> Bool check v = any (v ==) ['a','o','e','i','u']
或者可以简化代码,直接用elem替代自定义的check函数,逻辑完全一致:
getCount :: String -> Int getCount s = sum [1 | c <- s, c `elem` ['a','o','e','i','u']]
补充说明
- 空字符串的模式
""必须显式处理,因为Haskell的字符串本质是[Char],空串对应列表[],原代码只匹配了非空列表(x:xs),漏掉了空列表的情况。 - 这个非穷尽模式的问题在所有Haskell环境中都存在,只是Jupyter的测试覆盖范围没涉及空字符串,所以没触发报错。
内容的提问来源于stack exchange,提问作者coderoftheday
相关产品推荐
相关产品推荐

