在尝试读取点分隔整数列表时,我注意到了一件奇怪的事情。
Prelude> (reads "123") :: [(Integer,String)]
[(123,"")]
Prelude> (reads "123.") :: [(Integer,String)]
[(123,".")]
Prelude> (reads "123.456") :: [(Integer,String)]
[]
我理解为什么它会在实施方面发生(readNumber
成功,然后convert
失败),并且我了解如何使用readDec
来克服它。
我的问题是,这种行为是否记录在报告的某个地方?如果是这样,为什么?
答案 0 :(得分:1)
报告中不会记录这一点,报告中似乎出现差异。
出于效率原因,GHC标准库与报告中的参考实现有许多不同之处。但是,除非仔细注意,否则实现应该与行为匹配。
但是,如果我们查看Haskell报告的relevant part,我们会看到
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的库列表中。