Proposal: Add Text.Read.maybeRead :: Read a => String -> Maybe a

Jules Bean jules at jellybean.co.uk
Fri Feb 8 04:51:34 EST 2008


Dan Doel wrote:
>     readEither s =
>       case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
>         [x] -> Right x
>         []  -> Left "Prelude.read: no parse"
>         _   -> Left "Prelude.read: ambiguous parse"

Because there are multiple error cases, I support the Monad version.

I agree with everyone who has said that fail is a wart, but since we 
don't have a haskell98 'MonadStringError', and 'MonadError' requires 
fundeps and MPTCs, I think fail is the best we have at the moment.

If we were prepared to endorse fundeps and MPTCs then I might support a 
(Error e, MonadError e m,Read a) => String -> m a type.

If there was only one error case, then Maybe would contain enough 
information, and I would support the simpler version. As there are three 
(no parse, ambiguous parse, and incomplete parse), it is losing 
information just to product Nothing.

+1 for Text.Read.readM from me.

Dan points out in conversation that a MonadPlus constraint might be 
considered a 'valid hint' that fail is a sensible operation.

Without wishing to derail the conversation, common combinators to 
promote and demote error types might be good thigns to document and 
possibly even include in the standard lib. One example which springs to 
mind is

maybe (fail "it went wrong") return

which the combinator to "promote" from unlabelled errors (Maybe) to 
labelled errors (presumably in an error monad). Or with a custom error 
type, something like

maybe (throwError ThereWasAProblem) return

which could be set up as an infix like this:

possiblyFailingOperation `withError` ThereWasAProblem

There are a whole bunch of tricks like this for embedding one error 
strategy inside another which are 'obvious' and even 'folklore' but not 
written down.

Jules




More information about the Libraries mailing list