Haskell给列表元素添加字符前缀时类型匹配报错问题咨询
报错原因分析
- 运算符优先级与类型不匹配:Haskell中
++(列表拼接)和:(元素追加到列表头)优先级相同且为右结合,你写的[a] ++ x : addForEvery a xs会被解析为[a] ++ (x : addForEvery a xs)。其中[a]是[Char]类型,x : addForEvery a xs是[String](即[[Char]])类型,两类不同元素的列表无法直接拼接,因此触发类型匹配错误。 - 递归缺少边界条件:你只实现了非空列表
(x:xs)的匹配分支,没有处理空列表的情况,即使类型修正后,程序运行到列表末尾也会抛出模式匹配错误。 - 额外注意:顶层不能直接写
print语句,需要放入main函数中执行。
修正后的基础功能实现(给每个字符串加指定字符前缀)
如果你需要给每个字符串前加「指定字符+英文点」的前缀,修正代码如下:
-- 手动递归实现 addForEvery :: Char -> [String] -> [String] addForEvery _ [] = [] -- 空列表边界条件 addForEvery a (x:xs) = (a : '.' : x) : addForEvery a xs main :: IO () main = print $ addForEvery 'a' ["fa"] -- 输出 ["a.fa"]
更简洁的写法可以用map高阶函数避免手动写递归:
addForEvery :: Char -> [String] -> [String] addForEvery a = map (\x -> a : '.' : x)
符合需求的getNames最终实现
针对你要的「处理元组列表,给每个元组第二个元素加指定字符前缀」的需求,实现代码如下:
getNames :: Char -> [(Char, String)] -> [String] getNames prefix = map (\(_, name) -> prefix : '.' : name) -- 测试用例 main :: IO () main = print $ getNames 'A' [('A', "Smith"), ('J', "Brown")] -- 输出 ["A.Smith","A.Brown"]
和你给出的示例效果完全一致。
内容的提问来源于stack exchange,提问作者China Thursunalieve
相关产品推荐
相关产品推荐

