八进制数是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
。这是故意的吗?
答案 0 :(得分:7)
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
...并且lex :: ReadS String
与read
不同,它专门产生String
结果,而不是允许您选择Read
的实例。
要获得所需的行为,请提供适当的类型注释或签名:
GHCi> read "0o10" :: Integer
8