<div dir="ltr">In both cases, it's not actually creating a typeclass instance.  However, because (<=) from Ord is declared in GHC.Classes, you're able to create a new (but completely unrelated) function named (<=).  The fully qualified names for these would be GHC.Classes.<= and YourModule.<=, so they don't clash (but if you tried to use <= without qualifying it, you'd get an ambiguous reference error).<div><br></div><div>In the case of Rev, you get an error, though, because both the class method and the standalone function are declared in YourModule, which is illegal (multiple declarations of the same name).</div><div><br></div><div>So, long story short, go with the "instance" syntax.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 21, 2015 at 7:23 PM, Jeffrey Brown <span dir="ltr"><<a href="mailto:jeffbrown.the@gmail.com" target="_blank">jeffbrown.the@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Dear Haskellers,<br><br>The following compiles. (Rev stands for Reversible, and Dirn for Direction.)<br><br>    class Rev a where<br>        rev :: a -> a<br>    <br>    data Dirn = Succ | Pred<br>        deriving (Eq, Show, Ord)<br><br>    -- implement Ord<br>    (<=) Succ Pred = False<br>    (<=) _ _ = True<br>    <br>    -- implement Rev<br>    instance Rev Dirn where<br>        rev Succ = Pred<br>        rev Pred = Succ<br><br>But if I try to define the Rev instance the same way the Ord instance is being defined, it does not compile:<br><br>    class Rev a where<br>        rev :: a -> a<br>    <br>    data Dirn = Succ | Pred<br>        deriving (Eq, Show, Ord, Rev)<br>    <br>    -- implement Ord, because Dirn is used as a key in a Map<br>    (<=) Succ Pred = False<br>    (<=) _ _ = True<br>    <br>    -- implement Rev<br>    rev Succ = Pred<br>    rev Pred = Succ<br><br>What's going on?<br><br>Many thanks,<br>Jeff<br><br></div>
<br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br></div>