classes
Juan Carlos Arévalo Baeza
jcab@roningames.com
Fri, 31 Aug 2001 11:53:16 -0700
On Fri, 31 Aug 2001 12:56:32 +0300, Cagdas Ozgenc wrote:
>I am a newbie, so I might be making =A0nonsense.
You actually make much sense, and you betray your OO=
background (C++, maybe?). Programming in Haskell requires a very=
different way of thinking.
>In the following definiton:
>
>class Eq a where =A0 =A0 (=3D=3D) :: a ->=A0a ->=A0 Bool
>
>Why do we conlude that both of the "a" refer to the =A0same type?
In Haskell, a class is a very different concept than what you=
find in OO languages like C++. In OO languages, a class is the=
definition of a data type and its operations. In Haskell, it is=
an abstract set of operations but without a concrete data type.=
So:
class Eq a where =A0 =A0 (=3D=3D) :: a ->=A0a ->=A0 Bool
indicates that if a data type 'a' has been made an instance of=
'Eq', then that data type 'a' has the operation (=3D=3D) as defined=
in that instance. For example, if I define a data type:
data MyEnum =3D Sel1 | Sel2 | Sel3
and then define the instance of Eq:
instance Eq MyEnum where
Sel1 =3D=3D Sel1 =3D True
Sel2 =3D=3D Sel2 =3D True
Sel3 =3D=3D Sel3 =3D True
_ =3D=3D _ =3D False
then it's the same as having defined, in C++, a function such=
as:
bool operator=3D=3D(MyEnum s1, MyEnum s2)
{
if (s1 =3D=3D Sel1 && s2 =3D=3D Sel1) return true;
if (s1 =3D=3D Sel2 && s2 =3D=3D Sel2) return true;
if (s1 =3D=3D Sel3 && s2 =3D=3D Sel3) return true;
return false;
}
One advantage is that, in Haskell, you can specifically assert=
for instances of classes, while in C++ you have to rely in=
compiler errors that can be disorienting at times. For example,=
std::set<val> requires that the parameter type have a '<'=
operator, but you can't assert on it. In Haskell you can, using=
contexts:
class Ord a where
(<) :: a -> a -> Bool
data Set a =3D Ord a =3D> [...]
I don't know if I'm making sense. I'm not that proficient in=
Haskell myself.
>Apparently using different types that both belonging to class=
Eq
>results in an error. For example
>
>65 =3D=3D 'a'
As Ketil said, this can be done only using a non-standard=
extension of GHC. I believe there are a lot of people that wish=
it were standard, so I guess it'll be some day.
>It doesn't make much sense at first, however, how =A0do you go by
>implementing multiple polymorphism?
There are several kinds of polymorphism. For example, you=
could say Haskell supports multiple type polymorphism (as in=
multiple template arguments in C++).
>Secondly, why does Haskell distinguish between a =A0Type and a=
Class?
>There seems to be no benefit of such approach.
Oh, there's benefit. It does require a serious change in=
perspective, though. It can't be so easily explained.
>Thirdly, is it possible to define meta-classes in =A0Haskell?
Could you give an example of what you mean? If you mean=
meta-programming, no, Haskell doesn't really have any of that.=
You can do some things using polymorphic types, and the fact=
that Haskell is pure functional means that often the line=
between compile-time and run-time computations can blur a lot.
Salutaciones,
JCAB
email: jcab@roningames.com
ICQ: 101728263
The Rumblings are back: http://www.JCABs-Rumblings.com