[Haskell-cafe] Automatically Deriving Numeric Type Class Instances

Conal Elliott conal at conal.net
Sat Apr 23 22:20:44 UTC 2016


Hi Jake. I wrote applicative-numbers. The key observation is that every
applicative functor gives rise to instances of Num & friends in a standard
way, as you've noticed. Since your examples are isomorphic to functions
from a suitably chosen domain, and function-from-t is an applicative
functor for all types t, your examples are also applicative functors, with
instances you can derive (as in
http://conal.net/papers/type-class-morphisms/).

It might make for a simple and useful project to convert
applicative-numbers to use Template Haskell.

- Conal

On Fri, Apr 22, 2016 at 12:39 PM, Jake <jake.waksbaum at gmail.com> wrote:

> Thanks Adam! My only concern is that this package appears to use the CPP
> to generate the instances which at least to me feels more hacky than the
> mechanism by which instances are usually derived, like for Show or Eq or
> other classes.
>
> I'd also be interested if someone could explain how those instances are
> derived if I could do something similar myself in this case.
>
> On Fri, Apr 22, 2016, 15:14 adam vogt <vogt.adam at gmail.com> wrote:
>
>> Hi Jake
>>
>> https://hackage.haskell.org/package/applicative-numbers can generate
>> those instances.
>>
>> Regards
>> Adam
>> On Apr 22, 2016 10:23 AM, "Jake" <jake.waksbaum at gmail.com> wrote:
>>
>>> Is it possible to automatically derive instances of Numeric type classes
>>> like Num, Fractional, Real, Floating, etc?
>>>
>>> I currently have two datatypes, Pair and Triple, that are defined like
>>> this:
>>>
>>> data Pair a = Pair a a
>>> data Triple a = Triple a a a
>>>
>>> I wrote these pretty trivial instances for Num and Floating:
>>>
>>> instance Num a => Num (Pair a) where
>>>   (+) = liftA2 (+)
>>>   (*) = liftA2 (*)
>>>   abs = liftA abs
>>>   negate = liftA negate
>>>   signum = liftA signum
>>>   fromInteger = pure . fromInteger
>>>
>>> instance Fractional a => Fractional (Pair a) where
>>>   (/) = liftA2 (/)
>>>   recip = liftA recip
>>>   fromRational = pure . fromRational
>>>
>>> and practically identical instances for Triple as well.
>>>
>>> Is there anyway to have GHC derive these instances and the other numeric
>>> type classes?
>>>
>>> Thanks,
>>> Jake
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>>>
>>>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160423/f1910b48/attachment.html>


More information about the Haskell-Cafe mailing list