Numeric literals

Chris Angus CAngus@Armature.com
Tue, 28 Aug 2001 16:17:45 +0100


this is a bit ugly but would allow you to do 

if (x `isA` string) ...

or (x `isA` int) ...


int = int::Int
string = string::String

typeBind :: a -> ReadS a -> ReadS a
typeBind    _ x = x

isA :: Read a => String -> a -> Bool
isA s x = not (null (typeBind x (readsPrec 0) s))


-----Original Message-----
From: Simon Marlow [mailto:simonmar@microsoft.com]
Sent: 28 August 2001 15:53
To: Mark Carroll; haskell-cafe@haskell.org
Subject: RE: Numeric literals


> I also haven't yet worked out how to tell if a string is "read"able or
> not, yet - if (read "45")::Integer or whatever gives an error 
> (e.g. if I'd
> put "af" instead of "45"), it seems to be pretty uncatchable, 
> which is a
> pain. How do I tell if an instance of reading will work, or 
> catch that it 
> didn't?

In GHC, you can do this:

   import Exception

	do result <- catch (evaluate (read "foo" :: Int))
			       (\error -> ... )

but unfortunately read doesn't raise a useful exception (just error
"Prelude.read: no parse"), so you can't filter it very easily.  However
I don't think that read is likely to raise any other exceptions.

Cheers,
	Simon

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe