[commit: base] master: Export "readEither" and add "readMaybe". (0e1a02b)
Iavor Diatchki
diatchki at galois.com
Fri Dec 23 00:43:35 CET 2011
Repository : ssh://darcs.haskell.org//srv/darcs/packages/base
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/0e1a02b96cfd03b8488e3ff4ce232466d6d5ca77
>---------------------------------------------------------------
commit 0e1a02b96cfd03b8488e3ff4ce232466d6d5ca77
Author: Iavor S. Diatchki <diatchki at galois.com>
Date: Thu Dec 22 15:43:31 2011 -0800
Export "readEither" and add "readMaybe".
This commit implements the change discussed in the following
thread on the Haskell libraries list:
http://www.haskell.org/pipermail/libraries/2011-December/thread.html#17290
NOTE: This only implements the change for GHC, but the change
makes sense for Hugs too... Perhaps we should simply re-implement 'readEither'
in terms of 'reads'?
>---------------------------------------------------------------
Text/Read.hs | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/Text/Read.hs b/Text/Read.hs
index cea334b..88784ac 100644
--- a/Text/Read.hs
+++ b/Text/Read.hs
@@ -42,6 +42,8 @@ module Text.Read (
#ifdef __GLASGOW_HASKELL__
readListDefault, -- :: Read a => ReadS [a]
readListPrecDefault, -- :: Read a => ReadPrec [a]
+ readEither, -- :: Read a => String -> Either String a
+ readMaybe -- :: Read a => String -> Maybe a
#endif
) where
@@ -50,6 +52,7 @@ module Text.Read (
import GHC.Base
import GHC.Read
import Data.Either
+import Data.Maybe
import Text.ParserCombinators.ReadP as P
#endif
#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
@@ -82,6 +85,9 @@ parens p = optional
reads :: Read a => ReadS a
reads = readsPrec minPrec
+-- | Parse a string using the 'Read' instance.
+-- Succeeds if there is exactly one valid result.
+-- A 'Left' value indicates a parse error.
readEither :: Read a => String -> Either String a
readEither s =
case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
@@ -94,6 +100,13 @@ readEither s =
lift P.skipSpaces
return x
+-- | Parse a string using the 'Read' instance.
+-- Succeeds if there is exactly one valid result.
+readMaybe :: Read a => String -> Maybe a
+readMaybe s = case readEither s of
+ Left _ -> Nothing
+ Right a -> Just a
+
-- | The 'read' function reads input from a string, which must be
-- completely consumed by the input process.
read :: Read a => String -> a
More information about the Cvs-libraries
mailing list