[Haskell-cafe] Best idiom for avoiding Defaulting warnings with ghc -Wall -Werror ??

Dave Bayer bayer at cpw.math.columbia.edu
Mon Jun 25 15:18:21 EDT 2007


On Mon, Jun 25, 2007 at 07:31:09PM +0100, Ian Lynagh wrote:

> I don't know if (^) in particular is what is causing you problems, but
> IMO it has the wrong type; just as we have
>     (!!)         ::                 [a] -> Int -> a
>     genericIndex :: (Integral b) => [a] -> b   -> a
> we should also have
>     (^)          :: (Num a)             => a -> Int -> a
>     genericPower :: (Num a, Integral b) => a -> b   -> a

On Jun 25, 2007, at 11:40 AM, David Roundy wrote:

> That would be great!

Ahh, a consensus I can enthusiastically support.

It would seem to me a good library design rule of thumb to make ANY  
argument that will be counted down to zero by simple recursion an  
Int, with the type of (^) a standard application of this general  
principle.

Even with strict evaluation and tail recursion, if I want to write  
something that's going to need more than 2^31 iterations, I want the  
compiler to make me jump through hoops to say so. With the current  
type for (^), I'm jumping through hoops to say something that I can  
more easily unroll by hand.

Your proposal for (^) would allow genericPower to use the  
asymptotically faster algorithm of writing out the exponent in binary  
and multiplying together repeated squares, leaving the simple  
recursion to (^).


More information about the Haskell-Cafe mailing list