[GHC] #1902: Restrict the type of (^), (^^), and add genericPower, genericPower'

GHC trac at galois.com
Sat Nov 17 08:58:50 EST 2007


#1902: Restrict the type of (^), (^^), and add genericPower, genericPower'
-------------------------------+--------------------------------------------
    Reporter:  igloo           |       Owner:         
        Type:  proposal        |      Status:  new    
    Priority:  normal          |   Milestone:  Not GHC
   Component:  libraries/base  |     Version:  6.8.1  
    Severity:  normal          |    Keywords:         
  Difficulty:  Unknown         |    Testcase:         
Architecture:  Unknown         |          Os:  Unknown
-------------------------------+--------------------------------------------
 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.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1902>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the Glasgow-haskell-bugs mailing list