[Haskell-cafe] Re: [off-topic] OOPer?
Larry Evans
cppljevans at suddenlink.net
Tue Nov 18 13:31:59 EST 2008
On 11/17/08 18:24, Daniel Yokomizo wrote:
> On Mon, Nov 17, 2008 at 9:49 PM, Maurício <briqueabraque at yahoo.com
> <mailto:briqueabraque at yahoo.com>> wrote:
>
> > (...) I don't recall where I found the following example, but
> copied
>
> > it locally as compelling evidence that the functional solution
> can be
> > much clearer and shorter than the same solution modeled with
> objects
> > and inheritance.
[snip]
>
> > -- Arithmetic expression forms data Expr = Num Int | Add Expr Expr
> >
> > -- Evaluate expressions
> > eval :: Expr -> Int
> > (...)
>
>
> > public abstract class Expr {
> > public abstract int eval ();
> > public abstract void modn(int v);
[snip]
> when the first standard was set, and I can tell you for sure
that, even
> at that time, no one who knows at least the basics of C++
would ever
> write that problem like this.
Mauri, I'm not sure what you mean. Do you mean:
1) No C++er would ever "structure" the problem like:
-- Arithmetic expression forms
data Expr = Num Int | Add Expr Expr
-- Evaluate expressions
eval :: Expr -> Int
eval (Num i) = i
eval (Add l r ) = eval l + eval r
If so, then I'm unsure what you could mean since
the closest counterpart to:
date Expr = Num Int | Add Expr Expr
in c++ is an abstract Expr class with derived
classes, Int and Add, just as shown in Greg's Java counterpart to
the haskell Expr.
2) No C++er would every solve the problem with a heirarchy of Expr
classes with virtual functions.
If so, then I'm really confused because that's exactly the way I
would do it *except* if I wanted to avoid the overhead of
virtual function dispatch. In this case, I would use template
metaprogramming (WARNING: not for c++ template metaprogramming
novices):
http://www.boost.org/doc/libs/1_37_0/doc/html/proto/users_guide.html#boost_proto.users_guide.intermediate_form.expression_introspection.defining_dsel_grammars
In the proto metaprogramming, AFAICT, the 1st element of the
proto::expr template, the tag, corresponds to Expr constructor's,
Num and Add, of Greg's haskell example code. The | separating
the Expr constructor variants corresponds to the proto::or_
template.
So, if template metaprogramming were used, then there are some
very good c++ programmer which would structure their c++ code
like the haskell code (although, as seen by the
#boost_proto.users_guide.intermediate_form.expression_introspection.defining_dsel_grammars
reference, it's "a bit obscured" by all the "scaffolding" needed
to make it work).
Another reference which *may* reflect the haskell structure is:
http://research.microsoft.com/~akenn/generics/gadtoop.pdf
I must admit I don't really understand it, but it seems to have
some similarities to haskell's structure. The author even uses
haskell code to compare with his corresponding extension to
c#. In particular, page 9 contains an example use of his proposed
switch statement extension which looks very similar to the way
haskell would pattern match on an expression to dispatch to the
appropriate case.
[snip]
More information about the Haskell-Cafe
mailing list