Validation Haskell:检查字符串是否为有效数字
当检查字符串是否为有效数字时,如何检查小数点 我的想法是,我使用了如下内容,但添加了代码来检查小数点Validation Haskell:检查字符串是否为有效数字,validation,haskell,Validation,Haskell,当检查字符串是否为有效数字时,如何检查小数点 我的想法是,我使用了如下内容,但添加了代码来检查小数点 isNumber :: String -> Bool isNumber xs = all isDigit xs || add extra code here 其中,有效数字在EBNF中定义为: number -> .digit+ | digit+ [ .digit*] 例如,.5,1.5,1,1。都是有效的数字+ 表示一个或多个事件,*表示零个或多个。请查看,然后: 不过,也许有
isNumber :: String -> Bool
isNumber xs = all isDigit xs || add extra code here
其中,有效数字在EBNF中定义为:
number -> .digit+ | digit+ [ .digit*]
例如,.5,1.5,1,1。都是有效的数字+
表示一个或多个事件,*表示零个或多个。请查看,然后:
不过,也许有更好的办法
请注意,这将返回
True
,对于在Haskell中被视为有效的数字,您的特定用例并不完全包含在本文档中。如果您需要根据您的规范进行自定义解析,您应该使用类似于Parsec的东西,正如@CarstenKönig在他的评论中所建议的那样。这里有一个简单的策略:
“
和”
,但我们可以将它们视为特殊情况
翻译成哈斯克尔:
isNumber :: String -> Bool
isNumber "" = False
isNumber "." = False
isNumber xs =
case dropWhile isDigit xs of
"" -> True
('.':ys) -> all isDigit ys
_ -> False
一种简单的方法是使用
readMaybe
将字符串转换为数字
import Text.Read
因此,为了检查它是否是双精度的
readMaybe "123" :: Maybe Double
Just 123.0
readMaybe "12a3" :: Maybe Double
Nothing
后者返回Nothing
,字符串不是有效数字。以类似的方式,如果我们假设它是一个Int
readMaybe "12.3" :: Maybe Int
Nothing
使用这个
isNumber“1.0”。
(甚至1.xxx
)也是正确的
-这有效吗?几乎。。。请立即尝试“1.”
或“.5”
。)(我只想让你根据规范测试你的代码:P-这真的不像看上去那么简单-但也许OP对此没问题)注意,这种方法也会接受负数和科学格式的数字,例如“1.3e5”
。抱歉,EBNF中有一个输入错误。第一部分应该是.digit+而不是:。Valid数字必须能够以小数点开始!我建议对此使用parsec
(或类似的东西)
readMaybe "12.3" :: Maybe Int
Nothing