Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation Haskell:检查字符串是否为有效数字_Validation_Haskell - Fatal编程技术网

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在他的评论中所建议的那样。

这里有一个简单的策略:

  • 去掉字符串开头的所有数字
  • 剩下的字符串现在应该是

    a) 空字符串,或

    b) 后跟所有数字的小数点

  • 嗯,差不多了。这也将匹配空字符串
    ,但我们可以将它们视为特殊情况

    翻译成哈斯克尔:

    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