чтение восьмеричного числа - PullRequest
0 голосов
/ 22 ноября 2018

Восьмеричные числа являются частью целочисленного синтаксиса Haskell.Также lex распознает это:

Prelude> lex "0o10"
[("0o10","")]

Но read нет (ghc 8.0.2 в Ubuntu 18.04):

Prelude> read "0o10"
*** Exception: Prelude.read: no parse

В отчете не очень ясно об этом6.3.3.Он просто утверждает, что lex читает лексему и что lex используется read.Это предназначено?

1 Ответ

0 голосов
/ 22 ноября 2018

Тип 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

... и что lex :: ReadS String, в отличие от read, специально генерирует String результаты, а не позволяет вам выбрать экземпляр Read.

Чтобы получить ожидаемое поведение, предоставьте подходящую аннотацию типа или подпись:

GHCi> read "0o10" :: Integer
8
...