The problem here is even slightly deeper than you might realize. For example, what if you have a list of functions. How do you compare two functions to each other to see if they're equal? There is no good way really to do it! So, not only is == not completely polymorphic, but it CAN'T be. <br>
<br>There is a nice solution for this, however, and it's very simple:<br><br>contain :: Eq a -> [a] -> Bool<br>
contain x [] = False<br>
contain x (y:ys) = if x == y then True else contain x ys<br><br>The "Eq a" in the type signature says that 'a' must be a member of the 'Eq' typeclass. That says, in turn, that 'a' must have == defined for it. Fortunately, most types have, or can easily derive that definition. Here is the definition of the typeclass:<br>
<br><span class="keyword">class</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Eq.html#t%3AEq">Eq</a> a <span class="keyword">where</span><table class="vanilla" cellpadding="0" cellspacing="0">
<tbody><tr><td class="decl"><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Eq.html#v%3A%3D%3D">(==)</a> :: a -> a -> <a href="http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim/GHC-Bool.html#t%3ABool">Bool</a></td>
</tr><tr><td class="decl"><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Eq.html#v%3A%2F%3D">(/=)</a> :: a -> a -> <a href="http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim/GHC-Bool.html#t%3ABool">Bool</a></td>
</tr></tbody></table><br>That is, for 'a' to be a member of 'Eq', it must have a == operator which can take 2 values of that type and return a Boolean, saying whether or not they're equal, and it must also have a definition for the /= operator, which is "not equal". These two are also defined in terms of each other, so if you define ==, you get /= for free, and vice versa. <br>
<br>That's probably more information than you needed to know, but I hope it helps.<br><br><div class="gmail_quote">2008/12/22 Raeck Zhao <span dir="ltr"><<a href="mailto:raeck@msn.com">raeck@msn.com</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>
<div>
I am trying to define a containing function to see if a value is one
of the elements within a list which is polymorphic, but failed with the
following codes:<br>
> contain :: a -> [a] -> Bool<br>
> contain x [] = False<br>
> contain x (y:ys) = if x == y then True else contain x ys
it seems that the problem is the 'operator' == does not support a polymorphic check? <br>
Any way can solve the problem? or any alternative solution to achieve the purpose?<br>
Thanks!<br>
Raeck<br> </div><br><hr>It's the same Hotmail®. If by "same" you mean up to 70% faster. <a href="http://windowslive.com/online/hotmail?ocid=TXT_TAGLM_WL_hotmail_acq_broad1_122008" target="_blank">Get your account now.</a></div>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>