[Haskell-cafe] Subtype polymorphism in Haskell
Miguel Mitrofanov
miguelimo38 at yandex.ru
Tue Jul 6 06:55:53 EDT 2010
Actually, I liked Tillmann Rendel's idea much better than my own one:
data A = A {do_x :: Int -> Int -> Int}
b = A {do_x = \x y -> ...}
c = A {do_x = \x y -> ...}
Simon Courtenage wrote:
> My thanks to everyone who replied with their helpful comments. You are
> right that I forgot to add the public inheritance on the C++ classes
> (that's what happens when you write code in an email without passing it
> through a compiler first).
>
> I like the idea below, which is easy to understand. It seems to me,
> though, that there's a lot more to the use of typeclasses than is
> covered in some of the haskell textbooks, and if anyone knows of a good
> in-depth treatment of this, I would be grateful for a pointer.
>
> Thanks again to everyone who responded,
>
> Simon
>
> On Mon, Jul 5, 2010 at 2:28 PM, Miguel Mitrofanov <miguelimo38 at yandex.ru
> <mailto:miguelimo38 at yandex.ru>> wrote:
>
> My guess is that it's
> class B : public A
> and
> class C : public A
>
> In this case it seems perfect to use type classes:
>
> class A t where do_x :: t -> Integer -> Integer -> Integer
> data B = ...
> instance A B where do_x b x y = ...
> data C = ...
> instance A C where do_x c x y = ...
>
> If you want some general "A" object, you can use existentials (or,
> better yet, GADTs):
>
> data A_general = forall t. A t => A_general t
>
> or
>
> data A_GADT where A_GADT :: A t => t -> A_GADT
>
> so that
>
> int foo (A v) {... v.do_x(1,2)...}
>
> becomes
>
> foo :: A_GADT -> Integer
> foo (A_GADT v) = ... do_x v 1 2 ...
>
> Simon Courtenage wrote:
>
> Hi,
>
> I am porting a C++ program to Haskell. My current task is to
> take a class hierarchy and produce something equivalent in
> Haskell, but I don't seem to be able to get a grip on how type
> classes and instances contribute to the solution. Can anyone
> enlighten me?
>
> Roughly, the class hierarchy in C++ is of the form
>
> class A {
> public:
> virtual int do_x(int,int) = 0;
> };
>
> class B {
> public:
> int do_x(int x,int y) { ...}
> };
>
> class C {
> public:
> int do_x(int x,int y) { ...}
> };
>
> Any help would be greatly appreciated.
>
> Thanks
>
> Simon
> courtenage at gmail.com <mailto:courtenage at gmail.com>
> <mailto:courtenage at gmail.com <mailto:courtenage at gmail.com>>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org <mailto:Haskell-Cafe at haskell.org>
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
>
>
> --
> ------------------------------------------------------------------------
> Simon Courtenage | simoncourtenage.wordpress.com
> <http://simoncourtenage.wordpress.com>
> Twitter: simoncourtenage | Skype: simon99ctg
> Facebook: Simon Courtenage | IM: simon2263 at hotmail.com
> <mailto:simon2263 at hotmail.com>
More information about the Haskell-Cafe
mailing list