2015-12-14 4 views
20

При попытке прочитать список целых чисел, разделенных точками, я заметил странную вещь.Не удается прочитать целые числа, разделенные точками

Prelude> (reads "123") :: [(Integer,String)] 
[(123,"")] 
Prelude> (reads "123.") :: [(Integer,String)] 
[(123,".")] 
Prelude> (reads "123.456") :: [(Integer,String)] 
[] 

Я понимаю, почему это происходит с точки зрения реализации (readNumber преуспевает, а затем convert терпит неудачу), и я понимаю, как использовать readDec, чтобы преодолеть его.

Вопрос в том, является ли это поведение документированным где-то в отчете? Если да, то почему?

+1

Хороший улов. Я предполагаю, что существует эквивалент регулярного выражения '\ d + \. \ D +', соответствующий Double и не соответствующий Integer. Я также сомневаюсь, что вы можете получить более одного элемента, так как он будет с жадностью сопоставлять все после первого Integer с String. – karakfa

+3

Это звучит немного неправильно. Тем не менее, 'Read' предназначен в первую очередь для анализа вещей, которые выглядят как Haskell, и ничего, что похоже на Haskell, разумно примет' '123." ++ ничего ", кроме как буква" Дробный ". – dfeuer

+3

@dfeuer Насколько вы уверены в этом? ': t 123.456e3' =>' 123.456e3 :: Num a => a' с включенным NumDecimals. ;-) –

ответ

1

Это не только не задокументировано в отчете, оно, как представляется, составляет в отклонении от.

Существует много мест, где по соображениям эффективности или иным образом стандартные библиотеки GHC отклоняются от эталонных реализаций в отчете. Но, если не будет тщательно отмечено, реализации должны соответствовать поведению.

Однако, если мы посмотрим на relevant part Отчета Haskell, мы видим

instance Read Int where 
    readsPrec p r = [(fromInteger i, t) | (i,t) <- readsPrec p r] 
     -- Reading at the Integer type avoids 
     -- possible difficulty with minInt 

instance Read Integer where 
    readsPrec p   = readSigned readDec 

Мы видим, что она использует другую реализацию, что я не думаю, что имеет такое поведение.

Итак, это то, что, безусловно, должно быть поднято в списке библиотек на сайте haskell.org.

Смежные вопросы