[Haskell-beginners] Semigroup Instances

Theodore Lief Gannon tanuki at gmail.com
Mon Feb 6 23:56:33 UTC 2017


Gmail put you in spam.

If you haven't figured this out since you asked -- it's a matter of
confusing (IMO bad) variable names. Check the data definition:

data Validation a b
  = Failure a
  | Success b
  deriving (Eq, Show)

Failures are always type a, and successes are always type b. The type
variables used in the first line correspond to these. But in the
definitions of (<>), they are just local values. The instance could be
rewritten like so:

instance Semigroup a => Semigroup (Validation a b) where
  Success x <> Success y = Success x
  Failure x <> Success y = Success y
  Success x <> Failure y = Success x
  Failure x <> Failure y = Failure (x <> y)

On Thu, Jan 26, 2017 at 1:55 PM, Atrudyjane <atrudyjane at protonmail.com>
wrote:

> I'm currently studying semigroups and trying to figure out how to
> determine which type variables need a semigroup instance. Here are a couple
> of examples from Evan Cameron's github (https://github.com/leshow/
> haskell-programming-book/blob/master/src/Ch15ex.hs):
> (1)
> data Validation a b
>   = Failure a
>     | Success b
>     deriving (Eq, Show)
>
> instance Semigroup a => Semigroup (Validation a b) where
>   Success a <> Success b = Success a
>    Failure a <> Success b = Success b
>    Success a <> Failure b = Success a
>    Failure a <> Failure b = Failure (a <> b)
>
> * Why doesn't 'b' need an instance of semigroup?
> (2)
> newtype AccumulateRight a b = AccumulateRight (Validation a b) deriving (
> Eq, Show)
>
> instance Semigroup b => Semigroup (AccumulateRight a b) where
> AccumulateRight (Success a) <>AccumulateRight (Failure b) =AccumulateRight
> (Success a)
> AccumulateRight (Failure a) <>AccumulateRight (Success b) =AccumulateRight
> (Success b)
> AccumulateRight (Failure a) <>AccumulateRight (Failure b) =AccumulateRight
> (Failure a)
>
> AccumulateRight (Success a) <> AccumulateRight (Success b) =
> AccumulateRight (Success (a <> b))
>
> * Why doesn't 'a' need an instance of semigroup?
>
>
> Thank you,
> Andrea
>
>
> Sent with ProtonMail <https://protonmail.com> Secure Email.
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20170206/b9629a1d/attachment-0001.html>


More information about the Beginners mailing list