Haskell中tapChar函数报Non-exhaustive patterns错误排查
报错原因
tapChar的模式匹配存在遗漏,直接触发了非穷尽匹配错误:
- 你当前写的匹配规则
tapChar s (DaPhone [buttons]),只能匹配DaPhone构造器包裹的按钮列表恰好只有1个元素的场景 - 按钮列表为空、按钮数量≥2的所有场景都没有对应的处理分支,运行时传入这些参数就会抛出你看到的报错。
除此之外现有实现还有逻辑缺陷:即便命中了单按钮的匹配分支,代码也只会检查这一个按钮上有没有目标字符,找不到就返回无效的(' ', (-1)),完全不会遍历座机键盘上的所有按键查找目标字符,不符合功能预期。另外elemIndex返回的下标从0开始,直接当下压次数用也不对,按键上的第一个字符需要按1次,不是0次。
修正后代码
把tapChar的模式匹配改成覆盖任意长度按钮列表的写法,同时调整遍历逻辑,过滤掉不存在目标字符的按键,正确计算按压次数:
reverseTap :: DaPhone -> Char -> [(Digit, Presses)] reverseTap phone s | isUpper s = ('*', 1) : tapChar (toLower s) phone | otherwise = tapChar s phone where tapChar s (DaPhone buttons) = foldr matchBtn [] buttons where matchBtn btn res = case elemIndex s (phChar btn) of Just idx -> (digit btn, idx + 1) : res Nothing -> res phChar (Button _ chars) = chars digit (Button d _) = d
内容的提问来源于stack exchange,提问作者smuthu06
相关产品推荐
相关产品推荐

