Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't Haskell's Prelude.read return a Maybe?

Is there a good reason why the type of Prelude.read is

read :: Read a => String -> a 

rather than returning a Maybe value?

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

Since the string might fail to be parseable Haskell, wouldn't the latter be be more natural?

Or even an Either String a, where Left would contain the original string if it didn't parse, and Right the result if it did?

Edit:

I'm not trying to get others to write a corresponding wrapper for me. Just seeking reassurance that it's safe to do so.

like image 230
Bilal Barakat Avatar asked Nov 09 '11 14:11

Bilal Barakat


2 Answers

Edit: As of GHC 7.6, readMaybe is available in the Text.Read module in the base package, along with readEither: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe


Great question! The type of read itself isn't changing anytime soon because that would break lots of things. However, there should be a maybeRead function.

Why isn't there? The answer is "inertia". There was a discussion in '08 which got derailed by a discussion over "fail."

The good news is that folks were sufficiently convinced to start moving away from fail in the libraries. The bad news is that the proposal got lost in the shuffle. There should be such a function, although one is easy to write (and there are zillions of very similar versions floating around many codebases).

See also this discussion.

Personally, I use the version from the safe package.

like image 65
sclv Avatar answered Nov 22 '22 06:11

sclv


Yeah, it would be handy with a read function that returns Maybe. You can make one yourself:

readMaybe :: (Read a) => String -> Maybe a readMaybe s = case reads s of               [(x, "")] -> Just x               _ -> Nothing 
like image 42
augustss Avatar answered Nov 22 '22 05:11

augustss