Haskell函数调试:如何正确返回字符串中前两个后跟数字的字母?
Haskell函数错误分析与修正
你的代码返回Tt而非期望的AO,核心问题出在递归调用的步长错误,以及模式匹配的覆盖不全:
错误点拆解
- 递归步错误:原代码中
otherwise = cipher (y:xs)会直接跳过第二个字符z,导致每次递归都从第三个字符开始检查,相当于跳过了中间所有可能的连续字母对(比如Y y、y A、A O这些组合都被遗漏),直到最后遇到T t 0时才满足条件,返回Tt。 - 模式匹配覆盖不全:原代码未处理字符串长度为2的情况,递归过程中若剩余2个字符,会触发非穷尽模式的运行时错误。
修正后的代码
正确逻辑是每次递归仅向前移动一个字符,逐个检查连续两个字母是否后跟数字:
import Data.Char (isDigit, isLetter) cipher :: String -> String cipher "" = "" cipher [_] = "" cipher [_, _] = "" -- 两个字符后无数字,返回空 cipher (x:z:y:xs) | isLetter x && isLetter z && isDigit y = [x, z] | otherwise = cipher (z:y:xs) -- 递归时保留第二个字符,仅移除第一个
验证逻辑
对于输入字符串"4vkYyAO174midQTt0":
- 递归过程会依次检查每一组连续字符,直到匹配到
x='A'、z='O'、y='1'(数字),此时满足条件,返回"AO"
内容的提问来源于stack exchange,提问作者Serp
相关产品推荐
相关产品推荐

