[Haskell-beginners] How to manage typeclass hierarchies and instances?
Michael Orlitzky
michael at orlitzky.com
Sat Feb 21 03:09:45 UTC 2015
On 02/20/2015 06:58 PM, Stuart Hungerford wrote:
> Hi,
>
> I'm experimenting with Haskell typeclasses and could do with some
> advice on managing superclasses and instance declarations. Suppose I
> have these modules (please ignore any misunderstandings of abstract
> algebra concepts):
>
> -- in Semigroup.hs
>
> class Semigroup a where
> (|.|) :: a -> a -> a
>
> instance Semigroup Integer where
> (|.|) = (+)
>
>
> -- In Monoid.hs
>
> class (Semigroup a) => Monoid a where
> identity :: a
>
> instance Monoid Integer where
> identity = 0
>
>
> -- In Group.hs
>
> class (Monoid a) => Group a where
> inverse :: a -> a
>
> instance Group Integer where
> (|.|) = (+)
> identity = 0
> inverse = (-)
>
>
> In Group.hs I'm trying to create an (additive) group instance for
> Integer values but GHC complains that (|.|) and identity are not
> "visible" typeclass methods.
You only get one instance per type, so the Semigroup/Monoid instances
for Integer are "set in stone." When you "import Semigroup" and "import
Monoid", those instances come into scope. So in Group.hs, '|.|' and
'identity' are already defined for Integer. All you need is,
instance Group Integer where
inverse = negate
To add different instances, you'll need a newtype wrapper around Integer.
More information about the Beginners
mailing list