Haskell扫描合法整数字符串时+号解析错误如何修复
问题原因
- 原有校验逻辑存在缺陷:仅判断所有字符属于
+、0-9的集合,允许+出现在字符串任意位置(比如"1+2"会通过校验),不符合国家码的格式要求。 - Haskell标准库
read函数解析Integer类型时,仅支持-前缀或纯数字字符串,无法识别+开头的数字串,因此输入"+1"时会触发read自带的解析失败异常,而非自定义错误。 - 边界情况未处理:输入单独的
"+"时会通过字符校验,但后续read空串也会抛出系统级异常。
修改方案
优化校验规则,要求+只能出现在字符串首位且后续必须跟随数字,校验通过后去除开头的+再做解析,代码如下:
scanStringCC :: String -> Integer scanStringCC x = let validFormat = case x of -- 空串不合法 [] -> False -- +开头的情况,后续必须全为数字且不为空 '+':rest -> all (`elem` ['0'..'9']) rest && not (null rest) -- 非+开头的情况,所有字符必须是数字 _ -> all (`elem` ['0'..'9']) x in if validFormat -- 去除开头的+后解析 then read $ dropWhile (== '+') x :: Integer else error "Incorrect country code"
验证结果
scanStringCC "1"正常返回1scanStringCC "+1"正常返回1scanStringCC "a"抛出自定义异常*** Exception: Incorrect country codescanStringCC "1+2"抛出自定义异常*** Exception: Incorrect country codescanStringCC "+"抛出自定义异常*** Exception: Incorrect country code
内容的提问来源于stack exchange,提问作者Timo Junolainen
相关产品推荐
相关产品推荐

