
On 02/21/2015 04:15 PM, Stuart Hungerford wrote:
Thanks for that insight. Ignoring the instance issue for a minute, suppose I wanted to define a typeclass Additive where I'd like to set default implementations for the methods:
class (Num a, Group a) => Additive a where (|.|) = (+)
-- etc...
In this situation GHC says (|.|) is not a visible method. If I add a type declaration for (|.|) am I effectively "shadowing" the method from Semigroup with a new method rather than supplying a default implementation?
I don't think you can do that, but I wouldn't swear to it. One problem would be that you could declare a Semigroup instance of Integer independently of the Additive instance, and GHC would have to choose which operation to use. In this case Additive is more specific than Semigroup, but my instinct would be to prefer the Semigroup "override." I think some of these things are addresses in, https://ghc.haskell.org/trac/ghc/wiki/IntrinsicSuperclasses but I've never made it through the whole document =)