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

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" 正常返回 1
  • scanStringCC "+1" 正常返回 1
  • scanStringCC "a" 抛出自定义异常 *** Exception: Incorrect country code
  • scanStringCC "1+2" 抛出自定义异常 *** Exception: Incorrect country code
  • scanStringCC "+" 抛出自定义异常 *** Exception: Incorrect country code

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 04:00:00