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

Bil*_*kat 103 parsing haskell types

Prelude.read的类型是否有充分的理由

read :: Read a => String -> a
Run Code Online (Sandbox Code Playgroud)

而不是返回一个Maybe值?

read :: Read a => String -> Maybe a
Run Code Online (Sandbox Code Playgroud)

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

或者甚至是一个Either String a,Left如果没有解析的话会包含原始字符串,如果是的话会Right得到结果?

编辑:

我不是想让其他人为我写一个相应的包装器.只是寻求保证这样做是安全的.

scl*_*clv 102

编辑:自GHC 7.6起,readMaybe可在Text.Read基本软件包的模块中找到,以及readEither:http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: readMaybe


好问题!读取本身的类型不会很快改变,因为这会破坏很多东西.但是,应该有一个maybeRead功能.

为什么不存在?答案是"惯性".有一个08年的讨论,其得到通过在讨论出轨"失败".

好消息是,人们已经足够信服开始摆脱图书馆的失败.坏消息是该提议在洗牌中丢失了.这里应该是这样的功能,但一个是容易写(并有漂浮的许多代码库非常类似的版本不计其数).

另见本讨论.

就个人而言,我使用的是安全包中的版本.


aug*_*tss 30

是的,使用返回Maybe的read函数会很方便.你可以自己做一个:

readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
              [(x, "")] -> Just x
              _ -> Nothing
Run Code Online (Sandbox Code Playgroud)

  • 如果@augustss无法提供,则可能不存在更好的答案. (6认同)
  • 谢谢!我希望编辑听起来不感恩!:)只是想说清楚我不是在说懒惰...... (3认同)
  • 我不认为在原始设计中曾经讨论过一个版本.许多这些事情随着经验变得明显,但很难预测. (2认同)

yat*_*975 15

除了惯性和/或改变的见解,另一个原因可能是,它的美观有可以作为一种反向的作用功能show.也就是说,你希望那read . show是标识(这是一个实例类型ShowRead),并且show . read是在范围内的身份show(即show . read . show == show)

具有断裂Maybe类型read的对称性show :: a -> String.

  • 这是一个有趣的观点,但最终是错误的对称性.程序员应该重视美学上的正确性. (9认同)

lps*_*ith 12

正如@augustss指出的那样,您可以自己进行安全读取功能.但是,他readMaybe与read不完全一致,因为它不会忽略字符串末尾的空格.(我犯过这个错误,我不太记得上下文)

Haskell 98报告中查看read定义,我们可以修改它以实现readMaybe与之完全一致的read,并且这不是太不方便,因为它依赖的所有函数都在Prelude中定义:

readMaybe        :: (Read a) => String -> Maybe a
readMaybe s      =  case [x | (x,t) <- reads s, ("","") <- lex t] of
                         [x] -> Just x
                         _   -> Nothing
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您只使用`safe`包,则可以获得正确版本的`readMaybe`(它叫做`readMay`,它与此版本相同. (3认同)

ami*_*dfv 7

这个函数(被称为readMaybe)现在是Haskell的前奏!(截至目前的基数--4.6)

  • 好吧,链接文本说它在Text.Read而不是Prelude(可能已经改变),但它仍然帮助了我! (2认同)