Haskell字符串解码函数异常求助:decode未按预期执行
问题分析与修正方案
原代码的核心问题
- 逻辑完全倒置:你的代码是遇到数字字符时重复数字本身,但需求是数字前的普通字符根据该数字重复,数字本身不保留在结果中。比如处理
"a1"时,你代码会保留'1',但实际需要的是把'a'重复1次。 - 递归终止错误:
otherwise = (x:xs)这个分支直接返回剩余字符串,完全跳过了后续的递归处理。比如输入"a1b2",处理第一个字符'a'时进入这个分支,直接返回整个"a1b2",根本没处理后面的'1'和'b2'。 - 未处理字符-数字配对:代码是逐个字符独立处理,没有把前一个普通字符和后一个数字关联起来,不符合需求的"字符根据其后数字重复"的逻辑。
修正后的实现(无库函数依赖)
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
相关产品推荐
相关产品推荐

