[Haskell-cafe] Defining a containing function on polymorphic list

Andrew Wagner wagner.andrew at gmail.com
Mon Dec 22 09:02:53 EST 2008


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.

There is a nice solution for this, however, and it's very simple:

contain :: Eq a -> [a] -> Bool
contain x [] = False
contain x (y:ys) = if x == y then True else contain x ys

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:

class Eq<http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Eq.html#t%3AEq>a
where(==)<http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Eq.html#v%3A%3D%3D>::
a -> a ->
Bool<http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim/GHC-Bool.html#t%3ABool>
(/=)<http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Eq.html#v%3A%2F%3D>::
a -> a ->
Bool<http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim/GHC-Bool.html#t%3ABool>
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.

That's probably more information than you needed to know, but I hope it
helps.

2008/12/22 Raeck Zhao <raeck at msn.com>

>  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:
> > contain :: a -> [a] -> Bool
> > contain x [] = False
> > 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?
> Any way can solve the problem? or any alternative solution to achieve the
> purpose?
> Thanks!
> Raeck
>
> ------------------------------
> It's the same Hotmail(R). If by "same" you mean up to 70% faster. Get your
> account now.<http://windowslive.com/online/hotmail?ocid=TXT_TAGLM_WL_hotmail_acq_broad1_122008>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20081222/58d29b34/attachment.htm


More information about the Haskell-Cafe mailing list