You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:39:18