Deprecating fromIntegral

Niklas Hambüchen mail at nh2.me
Thu Sep 21 22:02:15 UTC 2017


On 21/09/17 19:57, Edward Kmett wrote:
> hWaitForInput stdin 4294968296
> 
> is using fromInteger, not fromIntegral.fromInteger is the member of Num.
> fromIntegral is defined in terms of it and toInteger.
>
> Deprecating fromIntegral would do nothing to the example you offered at
> all as it isn't being called.

Ah, here is the misunderstanding.

It is not the call to to hWaitForInput that is overflowing.

hWaitForInput takes an `Int`, and so passing 4294968296 to it is
perfectly fine (on 64-bit platforms).

As described in the linked bug
https://ghc.haskell.org/trac/ghc/ticket/14262, the overflow is in the
code that implements hWaitForInput,

  ready :: FD -> Bool -> Int -> IO Bool
  ready fd write msecs = do
    r <- throwErrnoIfMinus1Retry "GHC.IO.FD.ready" $
            fdReady (fdFD fd) (fromIntegral $ fromEnum $ write)
                              (fromIntegral msecs)

in the `fromIntegral msecs`.

I provided the `hWaitForInput 4294968296` bit only to give an easily
reproducible example of how `fromIntegral` results in a significant bug.

I realise now that the `4294968296` is why you brought up the topic of
integer literals (which confused me a bit).

> Like it or not the existing numeric types in the Haskell ecosystem wrap,
> and changing this behavior would have non-trivial ramifications for
> almost all Haskell source code written to date.

I did not propose to change the behaviour of any existing function.

I said:

"
* fromInteger / fromIntegral
  - unchanged semantics, but emitting a deprecation warning
"

Niklas


More information about the Libraries mailing list