读取八进制数字

时间:2018-11-22 13:06:07

标签: haskell ghci

八进制数是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。这是故意的吗?

1 个答案:

答案 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 Stringread不同,它专门产生String结果,而不是允许您选择Read的实例。

要获得所需的行为,请提供适当的类型注释或签名:

GHCi> read "0o10" :: Integer
8