为什么Haskell的Prelude.read没有返回Maybe?

时间:2011-11-09 14:59:22

标签: parsing haskell types

为什么Prelude.read的类型

有充分的理由
read :: Read a => String -> a

而不是返回Maybe值?

read :: Read a => String -> Maybe a

由于字符串可能无法解析Haskell,后者不会更自然吗?

甚至是Either String a,其中Left包含原始字符串(如果它没有解析),Right结果如果没有?

修改

我并没有试图让其他人为我写一个相应的包装器。只是寻求保证这样做是安全的。

5 个答案:

答案 0 :(得分:99)

修改:自GHC 7.6起,readMaybe模块中的Text.Read模块中提供了readEither以及maybeReadhttp://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe


好问题!读取本身的类型不会很快改变,因为这会破坏很多东西。但是, 应该是{{1}}函数。

为什么不存在?答案是“惯性”。有一个discussion in '08因讨论“失败”而脱轨。

好消息是,人们已经足够信服开始摆脱图书馆的失败。坏消息是该提议在洗牌中丢失了。 应该是一个这样的函数,虽然一个很容易编写(并且有许多非常相似的版本在许多代码库中浮动)。

另见this discussion

就个人而言,我使用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是标识(对于ShowRead的实例类型),show . readshow范围内的标识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)