为什么Prelude.read的类型是
read :: Read a => String -> a
而不是返回Maybe
值?
read :: Read a => String -> Maybe a
既然字符串可能无法解析Haskell,那么后者不是更自然吗?
或者甚至是一个Either String a
,如果不解析,Left
将包含原始字符串,如果解析,则Right
结果?
编辑:
我并不是想让别人为我写一个相应的包装器。只是想让大家放心,这样做是安全的。
发布于 2011-11-09 23:08:48
编辑:从GHC7.6开始,可以在基础包的Text.Read
模块中使用readMaybe
,还可以使用readEither
:http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe
问得好!读取的类型本身不会很快改变,因为这会破坏很多东西。但是,应该有一个maybeRead
函数。
为什么没有呢?答案是“惯性”。有一个discussion in '08因为关于“失败”的讨论而脱轨了。
好消息是,人们被充分说服了,开始远离库中的失败。坏消息是,提案在混乱中迷失了方向。应该有这样一个函数,尽管它很容易编写(在许多代码库中有无数非常相似的版本)。
另请参见this discussion。
就我个人而言,我使用来自safe package的版本。
发布于 2011-11-09 23:09:55
是的,如果有一个可能返回的read函数,那就很方便了。你可以自己做一个:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
[(x, "")] -> Just x
_ -> Nothing
发布于 2011-11-10 20:16:10
除了惯性和/或不断变化的洞察力之外,另一个原因可能是拥有一个可以充当show
的倒数的函数在美学上是令人愉悦的。也就是说,您希望read . show
是标识(对于类型是Show
和Read
的实例),show . read
是show
范围内的标识(即show . read . show == show
)
read
类型的Maybe
打破了show :: a -> String
的对称性。
https://stackoverflow.com/questions/8066850
复制相似问题