为什么Prelude.read的类型
有充分的理由read :: Read a => String -> a
而不是返回Maybe
值?
read :: Read a => String -> Maybe a
由于字符串可能无法解析Haskell,后者不会更自然吗?
甚至是Either String a
,其中Left
包含原始字符串(如果它没有解析),Right
结果如果没有?
修改
我并没有试图让其他人为我写一个相应的包装器。只是寻求保证这样做是安全的。
答案 0 :(得分:99)
修改:自GHC 7.6起,readMaybe
模块中的Text.Read
模块中提供了readEither
以及maybeRead
:http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe
好问题!读取本身的类型不会很快改变,因为这会破坏很多东西。但是, 应该是{{1}}函数。
为什么不存在?答案是“惯性”。有一个discussion in '08因讨论“失败”而脱轨。
好消息是,人们已经足够信服开始摆脱图书馆的失败。坏消息是该提议在洗牌中丢失了。 应该是一个这样的函数,虽然一个很容易编写(并且有许多非常相似的版本在许多代码库中浮动)。
就个人而言,我使用safe package中的版本。
答案 1 :(得分:29)
是的,使用返回Maybe的read函数会很方便。你可以自己做一个:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
[(x, "")] -> Just x
_ -> Nothing
答案 2 :(得分:14)
除了惯性和/或改变见解之外,另一个原因可能是美学上令人愉悦的是具有可以作为show
的反转的函数。也就是说,您希望read . show
是标识(对于Show
和Read
的实例类型),show . read
是show
范围内的标识1}}(即show . read . show == show
)
Maybe
类型read
打破了show :: a -> String
的对称性。
答案 3 :(得分:11)
正如@augustss指出的那样,你可以自己做安全的读取功能。但是,他的readMaybe
与read不完全一致,因为它不会忽略字符串末尾的空格。 (我犯过这个错误,我不太记得上下文)
查看definition of read in the Haskell 98 report,我们可以对其进行修改,以实现与readMaybe
完全一致的read
,这不是太不方便,因为它所依赖的所有功能都已定义在序曲中:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case [x | (x,t) <- reads s, ("","") <- lex t] of
[x] -> Just x
_ -> Nothing
答案 4 :(得分:7)
此函数(称为readMaybe
)现在处于Haskell前奏中! (截至目前的基数--4.6)