PROPOSAL: Restrict the type of (^), (^^), and add genericPower, genericPower'

Henning Thielemann lemming at
Sat Nov 17 16:13:54 EST 2007

On Sat, 17 Nov 2007, David Benbennick wrote:

> I vote against this proposal.
> On 11/17/07, Ian Lynagh <igloo at> wrote:
> > In my experience this would remove 99.9% of all defaulting (mostly where
> > you write things like x^12 and 8^12), which means it's easier to get
> > -Wall clean without having to put :: Int annotations everywhere.
> I agree that is a benefit (making it easier to avoid warnings), but in
> my opinion it is a tiny benefit.

Let me guess - you don't use -Wall. :-) Warnings are not the problem,
warnings point to a problem. The problem here is, that the compiler has to
guess a type, because it cannot be infered from other operands.

> The inverse proposal has the same benefit, and doesn't require a
> change to GHC: just add intPower to your own code, and use it wherever
> you want.  If you are unhappy with the idea of using intPower, perhaps
> you understand why I'm unhappy with the prospect of having to use
> genericPower.

 Question: How often did you need the genericity of Haskell 98 (^) ? That
is, how often do you call (^) with a non-constant exponent and how often
is the exponent constant?
 If I have (^) with variable exponents too often in the code, I suspect
that I missed some optimizations like (iterate (x*) 1).

I have done (semi-automatically) some statistics on my mathematical stuff
in Haskell, namely

(^^) used with exponents
 pred n

(^) used with variable exponents

 degree xs
 degree xs
 degree ys
 mod n 2
 mod (p+1) 2

(^) used with constant exponents

2: 169 times
3:  31 times
4:   9 times
5:  10 times
6:   3 times
7:   2 times
8:   1 times
9:   1 times

If I search for '::Int', the most results are exponents of (^), others are
from enumerations like [(0::Int)..].

More information about the Libraries mailing list