读取八进制数

read-ing an octal number

八进制数是 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 读取一个词素,而 lexread 使用。这是故意的吗?

read "0o10"的类型是:

GHCi> :t read "0o10"
read "0o10" :: Read a => a

在GHCi中,类型变量a将默认为()as explained in the User's Guide:

GHCi> read "()"
()

请注意,您描述的行为不限于将被解析为八进制的字符串...

GHCi> read "[1,2,3]"
*** Exception: Prelude.read: no parse

... 与 read 不同,lex :: ReadS String 专门生成 String 结果,而不是让您选择 Read.[=23 的实例=]

要获得您期望的行为,请提供合适的类型注释或签名:

GHCi> read "0o10" :: Integer
8