Restrict the type of (^), (^^), and add genericPower, genericPower'
This got a warm reception when I mentioned it in http://www.haskell.org/pipermail/haskell-cafe/2007-June/027557.html so I'm formally proposing it now.
Note that this is a divergence from Haskell 98 (but the libraries already have a handful of small divergences, and Haskell' is just around the corner...).
In my opinion, (^)
has the wrong type. Just as we have, for example,
(!!) :: [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
(or some other function name). The same goes for (^^)
(genericPower'
).
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.
The impact to GHC's bootlibs and extralibs is minimal. In most cases we have things like 2^15
, where Int is clearly fine, although it happens to be defaulted to Integer currently. In Data.Complex
we have 2 cases of e^(2::Int)
which can now be beautified. There are several cases where the type is inferred to be Int
anyway.
There are 3 files where we really do have an Integer, and it does matter. They are all for parsing numbers of the form 18e43, in base/Text/Read/Lex.hs
, parsec/Text/ParserCombinators/Parsec/Token.hs
and haskell-src/Language/Haskell/Lexer.hs
.
Initial deadline: 1 Dec 2007.
Trac metadata
Trac field | Value |
---|---|
Version | 6.8.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Unknown |
Architecture | Unknown |