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

Haskell字符匹配映射问题:生成目标字符串列表的实现求助

Haskell字符映射遍历问题解决

问题分析

你需要实现的功能是:遍历输入字符串的每个字符,在给定的[(Char, String)]映射列表中查找匹配的字符键——找到则将对应字符串加入结果;未找到则将当前字符转为单字符字符串加入结果。但当前代码因为列表推导式的笛卡尔积遍历逻辑,导致每个字符对应映射列表的所有项生成结果,最终输出长度为字符串长度×映射列表长度的错误结果。

错误代码问题点

原代码的列表推导式同时遍历字符串索引和映射列表,形成笛卡尔积:

[ ... | num<-[0..(length str)-1],(inputChar,decodedValue) <- list]

这会让每个字符(通过str !! num获取)和映射列表的每一项配对,每个字符生成length list个结果。同时条件判断逻辑冗余,导致每个配对都输出一个值,最终得到16个元素的错误输出。

正确实现方案

方案1:使用标准库函数(简洁高效)

利用lookup函数在关联列表中查找键(返回Maybe String),再用fromMaybe处理未找到的情况:

import Data.Maybe (fromMaybe)

findc :: String -> [(Char, String)] -> [String]
findc str mappings = map (\c -> fromMaybe [c] (lookup c mappings)) str
  • lookup c mappings:在映射列表中查找字符c,找到返回Just 对应字符串,未找到返回Nothing
  • fromMaybe [c]:若为Nothing则返回[c](将字符转为单字符字符串),否则返回找到的字符串
  • map遍历输入字符串的每个字符,应用上述逻辑

方案2:手动递归实现(适合理解原理)

如果不想依赖库函数,可以自己写递归查找逻辑:

-- 单个字符的查找逻辑
findChar :: Char -> [(Char, String)] -> String
findChar c [] = [c]  -- 遍历完映射列表未找到,返回单字符字符串
findChar c ((k, v):rest)
  | c == k    = v    -- 找到匹配键,返回对应字符串
  | otherwise = findChar c rest  -- 未找到,继续递归查找剩余列表

-- 遍历字符串的每个字符应用查找逻辑
findc :: String -> [(Char, String)] -> [String]
findc str mappings = map (`findChar` mappings) str

测试验证

输入:

findc "HAHA" [('E', "AB"), ('F', "CD"), ('G', "EF"), ('H', "GG")]

两种方案的输出均为:["GG","A","GG","A"],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:45:37