Haskell邮件识别项目:如何指定目标值重复时返回Bool
解决特定字符重复检测的Haskell函数问题
首先,你的核心需求是检测字符串中是否存在指定字符(如.或_)重复出现,我们可以分两步修正代码:
1. 重构repeated函数,支持指定目标字符
原repeated函数检测的是任意字符重复,现在需要改成针对单个目标字符的重复检测。这里提供两种实现方式:
方式一:高效遍历版(推荐)
遇到目标字符后立即检查后续是否有重复,无需遍历整个字符串:
hasRepeatedTarget :: Char -> String -> Bool hasRepeatedTarget _ [] = False hasRepeatedTarget _ [_] = False hasRepeatedTarget c (x:xs) | x == c = any (== c) xs -- 当前字符是目标,检查后续是否有重复 | otherwise = hasRepeatedTarget c xs
方式二:简洁统计版
通过过滤统计目标字符的出现次数,逻辑更直观:
hasRepeatedTarget :: Char -> String -> Bool hasRepeatedTarget c s = length (filter (== c) s) >= 2
2. 实现检测特殊字符集合的函数
如果需要检查.或_中任意一个是否重复,我们可以基于上面的函数封装:
hasAnyRepeatedSpecial :: String -> Bool hasAnyRepeatedSpecial s = any (\c -> hasRepeatedTarget c s) ['.', '_']
现在调用hasAnyRepeatedSpecial "penuts.."就会返回True,完全符合你的预期。
原special函数的问题分析
你的special函数存在多个问题:
- 类型不匹配:函数声明为
[String] -> [String],但实际需要的是String -> Bool(或[String] -> [Bool]); - 逻辑错误:
map repeated x会把每个字符串转换成Bool,但后续filter (elem ['.','_'])试图在Bool列表中查找字符列表,类型完全不兼容。
如果需要批量处理多个字符串,返回每个字符串是否符合条件,可以写:
checkSpecialStrings :: [String] -> [Bool] checkSpecialStrings = map hasAnyRepeatedSpecial
内容的提问来源于stack exchange,提问作者Sengeki
相关产品推荐
相关产品推荐

