# add constraint to the context of the RULE

Claude Heiland-Allen claude at mathr.co.uk
Mon Mar 20 21:54:16 UTC 2017

```Hi all,

I have these functions:

toDouble :: (Rounding r, Precision p) => Rounded r p -> Double
fromDouble :: (Rounding r, Precision p) => Double -> Rounded r p

and I want to use RULES for optimization:

{-# RULES "realToFrac/toDouble" realToFrac = toDouble #-}
{-# RULES "realToFrac/fromDouble" realToFrac = fromDouble #-}

This doesn't work.  I found out (thanks to Stack Overflow via #haskell)
that I can modify the first rule to the following, which does compile
and also seems to fire in a simple test:

{-# RULES "realToFrac/toDouble" forall (x :: (Rounding r, Precision
p) => Rounded r p) . realToFrac x = toDouble x #-}

But I'm at a loss with the fromDouble rule, the error message is:

• Could not deduce (Rounding r) arising from a use of ‘fromDouble’
from the context: (Real Double, Fractional (Rounded r p))
bound by the RULE "realToFrac/fromDouble"
at src/Numeric/Rounded.hs:359:11-57
Possible fix:
add (Rounding r) to the context of the RULE "realToFrac/fromDouble"
• In the expression: fromDouble
When checking the transformation rule "realToFrac/fromDouble"

How do I apply the "possible fix" to the fromDouble rule?

Is it even possible with the RULES syntax?

Note, there are these instances (among others):

instance (Rounding r, Precision p) => Real (Rounded r p)
instance (Rounding r, Precision p) => Fractional (Rounded r p)

Full code at https://code.mathr.co.uk/rounded (claude5 branch).

Thanks for any insight,

Claude
--
https://mathr.co.uk
```