A sample revised prelude for numeric classes
Mon, 12 Feb 2001 13:15:14 -0500
On Mon, Feb 12, 2001 at 07:24:31AM +0000, Marcin 'Qrczak' Kowalczyk wrote:
> Sun, 11 Feb 2001 22:27:53 -0500, Dylan Thurston <email@example.com> pisze:
> > Reading this, it occurred to me that you could explictly declare an
> > instance of Powerful Integer Integer and have everything else work.
> No, because it overlaps with Powerful a Integer (the constraint on a
> doesn't matter for determining if it overlaps).
Point. Thanks. Slightly annoying.
> > > Then the second argument of (^) is always arbitrary RealIntegral,
> > Nit: the second argument should be an Integer, not an arbitrary
> > RealIntegral.
> Of course not. (2 :: Integer) ^ (i :: Int) makes perfect sense.
But for arbitrary RealIntegrals it need not make sense.
Please do not assume that
toInteger :: RealIntegral a => a -> Integer
toInteger n | n < 0 = toInteger negate n
toInteger 0 = 0
toInteger n | n > 0 = 1 + toInteger (n-1)
(or the more efficient version using 'even') terminates (in principle)
for all RealIntegrals, at least with the definition as it stands in my
proposal. Possibly toInteger should be added; then (^) could have the
type you suggest. For usability issues, I suppose it should. (E.g.,
users will want to use Int ^ Int.)
OK, I'm convinced of the necessity of toInteger (or an equivalent).
I'll fit it in.