首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Haskell的Prelude.read不返回一个可能?

为什么Haskell的Prelude.read不返回一个可能?
EN

Stack Overflow用户
提问于 2011-11-09 22:59:22
回答 5查看 14.8K关注 0票数 114

为什么Prelude.read的类型是

代码语言:javascript
复制
read :: Read a => String -> a

而不是返回Maybe值?

代码语言:javascript
复制
read :: Read a => String -> Maybe a

既然字符串可能无法解析Haskell,那么后者不是更自然吗?

或者甚至是一个Either String a,如果不解析,Left将包含原始字符串,如果解析,则Right结果?

编辑:

我并不是想让别人为我写一个相应的包装器。只是想让大家放心,这样做是安全的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-09 23:08:48

编辑:从GHC7.6开始,可以在基础包的Text.Read模块中使用readMaybe,还可以使用readEitherhttp://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe

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

为什么没有呢?答案是“惯性”。有一个discussion in '08因为关于“失败”的讨论而脱轨了。

好消息是,人们被充分说服了,开始远离库中的失败。坏消息是,提案在混乱中迷失了方向。应该有这样一个函数,尽管它很容易编写(在许多代码库中有无数非常相似的版本)。

另请参见this discussion

就我个人而言,我使用来自safe package的版本。

票数 114
EN

Stack Overflow用户

发布于 2011-11-09 23:09:55

是的,如果有一个可能返回的read函数,那就很方便了。你可以自己做一个:

代码语言:javascript
复制
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
              [(x, "")] -> Just x
              _ -> Nothing
票数 32
EN

Stack Overflow用户

发布于 2011-11-10 20:16:10

除了惯性和/或不断变化的洞察力之外,另一个原因可能是拥有一个可以充当show的倒数的函数在美学上是令人愉悦的。也就是说,您希望read . show是标识(对于类型是ShowRead的实例),show . readshow范围内的标识(即show . read . show == show)

read类型的Maybe打破了show :: a -> String的对称性。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8066850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档