При попытке прочитать список целых чисел, разделенных точками, я заметил странную вещь.Не удается прочитать целые числа, разделенные точками
Prelude> (reads "123") :: [(Integer,String)]
[(123,"")]
Prelude> (reads "123.") :: [(Integer,String)]
[(123,".")]
Prelude> (reads "123.456") :: [(Integer,String)]
[]
Я понимаю, почему это происходит с точки зрения реализации (readNumber
преуспевает, а затем convert
терпит неудачу), и я понимаю, как использовать readDec
, чтобы преодолеть его.
Вопрос в том, является ли это поведение документированным где-то в отчете? Если да, то почему?
Хороший улов. Я предполагаю, что существует эквивалент регулярного выражения '\ d + \. \ D +', соответствующий Double и не соответствующий Integer. Я также сомневаюсь, что вы можете получить более одного элемента, так как он будет с жадностью сопоставлять все после первого Integer с String. – karakfa
Это звучит немного неправильно. Тем не менее, 'Read' предназначен в первую очередь для анализа вещей, которые выглядят как Haskell, и ничего, что похоже на Haskell, разумно примет' '123." ++ ничего ", кроме как буква" Дробный ". – dfeuer
@dfeuer Насколько вы уверены в этом? ': t 123.456e3' =>' 123.456e3 :: Num a => a' с включенным NumDecimals. ;-) –