a***@gmail.com

2018-09-17 12:39:58 UTC

(Alexandre asked me to forward the email below on his behalf, because he is experiencing technical difficulties with this mail list. â Andrew)

Greetings CLC;

I'm writing 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 have created a Trac feature request ticket with the same contents as this email, and made a PR to GHCâs repository on GitHub.

To finalize, there are a few topics Iâd like to raise regarding this change.

1. Does the community find this change beneficial in general?

2. Does the community approve of using DataKinds in a mundane section of the base package?

3. Does everyone accept a small breaking change of E0, E1, etc. from a data type to a type synonym? Or should we go the conservative way and just add E without refactoring E0, E1, etc.?

Regards,

Alexandre

Greetings CLC;

I'm writing 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 have created a Trac feature request ticket with the same contents as this email, and made a PR to GHCâs repository on GitHub.

To finalize, there are a few topics Iâd like to raise regarding this change.

1. Does the community find this change beneficial in general?

2. Does the community approve of using DataKinds in a mundane section of the base package?

3. Does everyone accept a small breaking change of E0, E1, etc. from a data type to a type synonym? Or should we go the conservative way and just add E without refactoring E0, E1, etc.?

Regards,

Alexandre