八进制数是Haskell整数语法的一部分。lex
也识别它:
Prelude> lex "0o10"
[("0o10","")]
但read
没有(Ubuntu 18.04上的ghc 8.0.2(:
Prelude> read "0o10"
*** Exception: Prelude.read: no parse
6.3.3中的报告对此并不十分清楚。它只是声明lex
读取词位,并且lex
由read
使用。这是有意的吗?
read "0o10"
的类型为:
GHCi> :t read "0o10"
read "0o10" :: Read a => a
在GHCi中,类型变量a
将默认为()
,如《用户指南:》中所述
GHCi> read "()"
()
请注意,您描述的行为并不局限于将被解析为八进制的字符串。。。
GHCi> read "[1,2,3]"
*** Exception: Prelude.read: no parse
与read
不同,lex :: ReadS String
专门生成String
结果,而不是允许您选择Read
的实例。
要获得您期望的行为,请提供合适的类型注释或签名:
GHCi> read "0o10" :: Integer
8