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

Haskell函数调试:如何正确返回字符串中前两个后跟数字的字母?

Haskell函数错误分析与修正

你的代码返回Tt而非期望的AO,核心问题出在递归调用的步长错误,以及模式匹配的覆盖不全:

错误点拆解

  1. 递归步错误:原代码中otherwise = cipher (y:xs)会直接跳过第二个字符z,导致每次递归都从第三个字符开始检查,相当于跳过了中间所有可能的连续字母对(比如Y y、y A、A O这些组合都被遗漏),直到最后遇到T t 0时才满足条件,返回Tt。
  2. 模式匹配覆盖不全:原代码未处理字符串长度为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:55:17