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 对应字符串,未找到返回NothingfromMaybe [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
相关产品推荐
相关产品推荐

