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

Haskell实现scanString函数:纯数字字符串转整数,否则返回0

完善Haskell的scanString函数实现

我来帮你搞定这个scanString函数的实现,先看看你的代码里存在的问题,再给出符合需求的解决方案~

原代码的问题分析

  1. 语法错误:你的scanString的case表达式写法不对,case str of [] -> 0之后应该用x:xs -> ...的形式,不能直接跟守卫;另外scanChar的守卫语法也有小问题,多个守卫需要分行写。
  2. 逻辑缺陷:原思路只是把每个字符转成数字(非数字转0)然后累加,但这样scanString "12a"会得到1*100 + 2*10 + 0 = 120,不符合你要返回0的需求——我们需要先判断整个字符串是否全部由数字组成,只要有一个非数字就直接返回0。

解决方案

方案1:使用标准库函数(简洁高效)

我们可以用Data.Char模块里的isDigit函数来检查字符是否为数字,先判断整个字符串是否全是数字,再决定转成整数还是返回0:

import Data.Char (isDigit)

scanString :: String -> Int
scanString "" = 0  -- 空字符串直接返回0
scanString str
  | all isDigit str = read str  -- 全是数字则转成整数
  | otherwise = 0               -- 存在非数字则返回0

方案2:不依赖标准库(自己实现判断逻辑)

如果不想导入模块,也可以自己写一个判断字符是否为数字的辅助函数:

-- 自定义判断字符是否为数字的函数
isDigitChar :: Char -> Bool
isDigitChar c = fromEnum c >= fromEnum '0' && fromEnum c <= fromEnum '9'

scanString :: String -> Int
scanString "" = 0
scanString str
  | all isDigitChar str = read str
  | otherwise = 0

测试验证

  • scanString "123" → 123(符合预期)
  • scanString "12a" → 0(符合预期)
  • scanString "" → 0(符合空字符串的处理需求)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:08