2016-03-05 44 views
1

我试图从IO获得了一些这样的:是否有替代`read`返回Maybe?

numberString <- getLine 
print 3 + read numberString 

这个工作,如果numberString是数串好的(如“3241”),但如果它不是那么好(如“124gjh “),它抛出一个异常:

*** Exception: Prelude.read: no parse 

有一个reads函数返回一个[(a0, String)]和没事的时候是匹配的,这将是一个[]。有一个简单的办法,我有这样的事情:

read' :: String -> Maybe a 

,这样我只是得到一个Nothing如果事情不工作,而不只是突然停止?

+4

['readMaybe'](https://hackage.haskell.org/package/base-4.8.2.0/docs /Text-Read.html#v:readMaybe);)...您可以随时[Hoogle](https://www.haskell.org/hoogle/?hoogle=String+-%3E+Maybe+a)查看这些(虽然[Hayoo](http://hayoo.fh-wedel.de/?query=Read+a+%3D%3E+String+-%3E+Maybe+a)在这里做的更好) – Carsten

+1

@Carsten为什么不'readMaybe '虽然在查询的Hoogle结果中显示? –

+0

@ChrisMartin我真的没有线索 - 看起来Hoogle不会*看到*'Text.Read',即使它在基地 – Carsten

回答

4

有一个在Text.ReadreadMaybe正确的应该做的正是你问什么:

Prelude> import Text.Read(readMaybe) 
Prelude Text.Read> readMaybe "3241" :: Maybe Int 
Just 3241 
Prelude Text.Read> readMaybe "Hello" :: Maybe Int 
Nothing 
+0

''readEither''会给你失败的原因(解析错误) –

+0

well'Left”Prelude.read:no parse“'这里可能不会令人吃惊^^(也可能是模棱两可,看到这个*在野外*) – Carsten

+0

哦,我想我从来没有真正检查过什么左是:)很高兴知道,谢谢! –