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

Haskell字符串解码函数异常求助:decode未按预期执行

问题分析与修正方案

原代码的核心问题

  1. 逻辑完全倒置:你的代码是遇到数字字符时重复数字本身,但需求是数字前的普通字符根据该数字重复,数字本身不保留在结果中。比如处理"a1"时,你代码会保留'1',但实际需要的是把'a'重复1次。
  2. 递归终止错误:otherwise = (x:xs)这个分支直接返回剩余字符串,完全跳过了后续的递归处理。比如输入"a1b2",处理第一个字符'a'时进入这个分支,直接返回整个"a1b2",根本没处理后面的'1'和'b2'。
  3. 未处理字符-数字配对:代码是逐个字符独立处理,没有把前一个普通字符和后一个数字关联起来,不符合需求的"字符根据其后数字重复"的逻辑。

修正后的实现(无库函数依赖)

decode :: String -> String
decode [] = []
-- 处理单个剩余字符(非数字则直接保留)
decode [x] = [x]
-- 处理"普通字符+数字"的配对场景
decode (char:digit:rest)
    | digit >= '1' && digit <= '9' = repeatChar char (digitToInt digit) ++ decode rest
    -- 若第二个字符不是数字,保留当前字符,继续处理后续部分
    | otherwise = char : decode (digit:rest)
  where
    -- 手动实现字符重复逻辑
    repeatChar :: Char -> Int -> String
    repeatChar _ 0 = []
    repeatChar c count = c : repeatChar c (count - 1)
    -- 手动实现数字字符转整数
    digitToInt :: Char -> Int
    digitToInt d = fromEnum d - fromEnum '0'

代码逻辑说明

  • 边界处理:空字符串直接返回空;单个字符直接保留(避免最后一个字符是普通字符时出错)。
  • 配对处理:每次取前两个字符,判断第二个是否为数字:
    • 如果是数字,将第一个字符重复对应次数,然后递归处理剩下的字符串(跳过当前数字)。
    • 如果不是数字,保留第一个字符,递归处理剩下的字符串(包含第二个字符)。
  • 无库函数依赖:手动实现了字符重复和数字转整数的逻辑,完全不依赖标准库函数。

测试验证

调用decode "a1b2"会返回"abb",符合预期:

  • 'a'后跟'1' → 重复1次得到"a"
  • 'b'后跟'2' → 重复2次得到"bb"
  • 拼接后结果为"abb"

内容的提问来源于stack exchange,提问作者user13744763

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:30:51