Parsing 哈斯凯尔看不懂这个双重含义:“我不明白。”;。“3”;。这是虫子吗?

Parsing 哈斯凯尔看不懂这个双重含义:“我不明白。”;。“3”;。这是虫子吗?,parsing,haskell,double,Parsing,Haskell,Double,GHC Haskell似乎需要在小数点前加一个数字才能读取双精度。代码如下: main :: IO () main = do let d1 = read "0.3" :: Double d2 = read ".3" :: Double print d1 print d2 运行此命令将产生: 0.3 *** Exception: Prelude.read: no parse 这是一个GHC错误还是一个主要限制 (我试着用C、Javascript和MS Ex

GHC Haskell似乎需要在小数点前加一个数字才能读取双精度。代码如下:

main :: IO ()
main = do
  let d1 = read "0.3" :: Double
      d2 = read ".3"  :: Double      
  print d1
  print d2
运行此命令将产生:

0.3
*** Exception: Prelude.read: no parse
这是一个GHC错误还是一个主要限制

(我试着用C、Javascript和MS Excel阅读“.3”,所有这些都可以成功解析“.3”,并将其理解为一个数字。我想我在程序的其他方面也看到了这个问题的影响,包括用parseargs包读取命令行参数,用Yesod的MForms读取html表单中的双倍。)


此问题是否有已知的修复或解决方法?

来自Haskell报告:

2.5个数字文本

浮点文字必须包含字符前后的数字 小数点;这样可以确保小数点不会出错 对于点字符的另一种用法


所以这是预期的行为。

我接受iand675的回答,但他只留下评论,所以我将其复制到这里:

Haskell中所有具有读取实例的标准类型都被写入读取有效的Haskell。如果您正在对不能解析为有效Haskell的输入使用read,那么您可能应该使用read之外的内容


Lee的回答很有帮助,因为它定义了Haskell的数字文本。

这不是一个错误或问题,Haskell定义了浮点数,以0开头,并且
和数字之间没有空格。这是为了避免复合运算符的歧义。一个明显的修复方法是在读取字符串之前只在字符串前加上前缀“0”
readDouble s=read('0':s)::Double
bheklillr:我不明白在我的特定用例中,歧义会出现在哪里。我可以看出,在解析Haskell代码时,避免复合运算符的歧义是很重要的,但在我的例子中,read函数只是解析一个应该表示双精度的字符串。我想不出哪种情况下“.3”应该表示0以外的任何东西。3@Tad,Haskell中所有具有读取实例的标准类型都被写入读取有效的Haskell。如果您在无法解析为有效Haskell的输入上使用
read
,那么您可能应该使用
read
@MarkH之外的内容,我认为这不是一个好主意。有两种方法可能出错——特别是,如果数字为负数,那么从iand675的答案和Lee的答案中,我现在了解到read的设计目的是只解析有效的Haskell字符串。谢谢你的帮助。@Chuck-我以前从未使用过Ruby,但它似乎有一个非常简单的方法来实现我的目标:“.3”。to_f=>0。3@Tad:我的意思是,语言中关于浮点数的规则是相同的——在Ruby中,浮点数需要一个前导0
.3
是一个语法错误。是的,
“.3.”to-f
是有效的,但是
“.3鸡”也是有效的。to-f
,因为Ruby的
字符串#to-f
在设计上对它所接受的内容非常慷慨,而不是像Haskell那样需要有效的代码。