Haskell实现scanString函数:纯数字字符串转整数,否则返回0
完善Haskell的scanString函数实现
我来帮你搞定这个scanString函数的实现,先看看你的代码里存在的问题,再给出符合需求的解决方案~
原代码的问题分析
- 语法错误:你的
scanString的case表达式写法不对,case str of [] -> 0之后应该用x:xs -> ...的形式,不能直接跟守卫;另外scanChar的守卫语法也有小问题,多个守卫需要分行写。 - 逻辑缺陷:原思路只是把每个字符转成数字(非数字转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
相关产品推荐
相关产品推荐

