Skip to content

Generalize `E{0,1,2,3,6,9,12}` from `Data.Fixed`

Hello;

I'm creating this email to propose a change to Data.Fixed. Full credit for this idea goes to Bhavik Mehta (@b-mehta on GitHub), who implemented it in this PR for exact-pi.

In Data.Fixed there are several E-prefixed datatypes used to represent a certain number of digits of precision in fixed-precision arithmetic. For example, E1 has 1 decimal place, E12 has 12. Each of them, E{0,1,2,3,6,9,12} is hardcoded. If more precision types are to be provided, they have to be hardcoded as well, and all of these types resemble each other. I think there is room for improvement here.

Instead of having

data E0

instance HasResolution E0 where
    resolution _ = 1

and repeating it as many times as there are E datatypes, I propose to add the following type:

{-# LANGUAGE DataKinds      #-}
{-# LANGUAGE KindSignatures #-}

import GHC.TypeLits (Nat, KnownNat, natVal)

data E (n :: Nat)

and then do

instance KnownNat n => HasResolution (E n) where
    resolution _ = 10^natVal (undefined :: E n)

just once, replacing data E0 with type E0 = E 0 (and the same for the rest of them) to continue reexporting these types. E should also be exported.

I've sent an email to the Core Libraries Committee regarding this issue. This is my first contribution to GHC, if I'm doing something incorrectly please tell me.

Trac metadata
Trac field Value
Version 8.4.3
Type FeatureRequest
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Core Libraries
Test case
Differential revisions
BlockedBy
Related
Blocking
CC Bodigrim
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information