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