<div dir="ltr">Gmail put you in spam.<div><br></div><div>If you haven't figured this out since you asked -- it's a matter of confusing (IMO bad) variable names. Check the data definition:</div><div><br></div><font face="monospace, monospace">data Validation a b<br>  = Failure a<br>  | Success b<br>  deriving (Eq, Show)</font><div><br></div><div>Failures are always type <font face="monospace, monospace">a</font>, and successes are always type <font face="monospace, monospace">b</font>. The type variables used in the first line correspond to these. But in the definitions of <font face="monospace, monospace">(<>)</font>, they are just local values. The instance could be rewritten like so:</div><div><br></div><div><font face="monospace, monospace"><span style="font-size:12.8px">instance Semigroup a => Semigroup (Validation a b) where</span><br></font></div><div><div style="font-size:12.8px"><font face="monospace, monospace">  Success x <> Success y = Success x<br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">  Failure x <> Success y = Success y<br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">  Success x <> Failure y = Success x<br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">  Failure x <> Failure y = Failure (x <> y)</font></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 26, 2017 at 1:55 PM, Atrudyjane <span dir="ltr"><<a href="mailto:atrudyjane@protonmail.com" target="_blank">atrudyjane@protonmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>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 (<a href="https://github.com/leshow/haskell-programming-book/blob/master/src/Ch15ex.hs" target="_blank">https://github.com/leshow/<wbr>haskell-programming-book/blob/<wbr>master/src/Ch15ex.hs</a>):<br></div><div>(1)<br></div><div>data Validation a b<br></div><div>  = Failure a<br></div><div>    | Success b<br></div><div>    deriving (Eq, Show)<br></div><div><br></div><div>instance Semigroup a => Semigroup (Validation a b) where<br></div><div>  Success a <> Success b = Success a<br></div><div>   Failure a <> Success b = Success b<br></div><div>   Success a <> Failure b = Success a<br></div><div>   Failure a <> Failure b = Failure (a <> b)<br></div><div><br></div><div>* Why doesn't 'b' need an instance of semigroup?<br></div><div>(2)<br></div><div>n<span class="m_-6963159195776523985pl-k">ewtype</span> <span class="m_-6963159195776523985pl-en">AccumulateRight</span> <span class="m_-6963159195776523985pl-smi">a</span> <span class="m_-6963159195776523985pl-smi">b</span> <span class="m_-6963159195776523985pl-k">=</span> <span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-en">Validation</span> <span class="m_-6963159195776523985pl-smi">a</span> <span class="m_-6963159195776523985pl-smi">b</span>) <span class="m_-6963159195776523985pl-k">deriving</span> (<span class="m_-6963159195776523985pl-e">Eq</span>, <span class="m_-6963159195776523985pl-e">Show</span>)<br></div><div><br></div><div><span class="m_-6963159195776523985pl-k">instance</span> <span class="m_-6963159195776523985pl-en">Semigroup</span> <span class="m_-6963159195776523985pl-smi">b</span> <span class="m_-6963159195776523985pl-k">=></span> <span class="m_-6963159195776523985pl-en">Semigroup</span> (<span class="m_-6963159195776523985pl-en">AccumulateRight</span> <span class="m_-6963159195776523985pl-smi">a</span> <span class="m_-6963159195776523985pl-smi">b</span>) <span class="m_-6963159195776523985pl-k">where</span><br></div><div><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Success</span> a) <span class="m_-6963159195776523985pl-k"><></span><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Failure</span> b) <span class="m_-6963159195776523985pl-k">=</span><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Success</span> a)<br></div><div><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Failure</span> a) <span class="m_-6963159195776523985pl-k"><></span><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Success</span> b) <span class="m_-6963159195776523985pl-k">=</span><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Success</span> b)<br></div><div><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Failure</span> a) <span class="m_-6963159195776523985pl-k"><></span><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Failure</span> b) <span class="m_-6963159195776523985pl-k">=</span><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Failure</span> a)<br></div><br><table class="m_-6963159195776523985highlight m_-6963159195776523985tab-size m_-6963159195776523985js-file-line-container"><tbody><tr><td id="m_-6963159195776523985LC217" class="m_-6963159195776523985blob-code m_-6963159195776523985blob-code-inner m_-6963159195776523985js-file-line"><span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Success</span> a) <span class="m_-6963159195776523985pl-k"><></span> <span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Success</span> b) <span class="m_-6963159195776523985pl-k">=</span> <span class="m_-6963159195776523985pl-ent">AccumulateRight</span> (<span class="m_-6963159195776523985pl-ent">Success</span> (a <span class="m_-6963159195776523985pl-k"><></span> b)) <br><br>* Why doesn't 'a' need an instance of semigroup?<br><br><br>Thank you,<br>Andrea<br><br></td></tr><tr></tr></tbody></table><div class="m_-6963159195776523985protonmail_signature_block"><div class="m_-6963159195776523985protonmail_signature_block-user"><br></div><div class="m_-6963159195776523985protonmail_signature_block-proton">Sent with <a href="https://protonmail.com" target="_blank">ProtonMail</a> Secure Email.<br></div></div><div><br></div><br>______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br></div>