[Haskell-cafe] Re: Datatypes - Haskell

2008-02-12 Thread Jon Fairbairn
Richard A. O'Keefe [EMAIL PROTECTED] writes:

 On the subject of data types, I've recently seen Haskell code using
   data Foo ... = Foo { ... }
 where I would have used newtype instead of data.  When is it a good
 idea to avoid newtype?

When the code was written before newtype was introduced into
the language?  Also when { ... } is not a single type.

-- 
Jón Fairbairn [EMAIL PROTECTED]

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Datatypes - Haskell

2008-02-11 Thread Don Stewart
ok:
 On the subject of data types, I've recently seen Haskell code using
   data Foo ... = Foo { ... }
 where I would have used newtype instead of data.  When is it a good
 idea to avoid newtype?

It depends what's in the ...

If its just something with the same representation as an existing type,
using a newtype makes sense. If it builds a more complicated
single-contructor type, such as many record types, then data is
required.

-- Don

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Re: Datatypes - Haskell

2008-02-10 Thread Mattes Simeon
Thanks for your help. It was very useful. 

Though in comparison with C or C++ I can't figure out so clear the syntax. 
Maybe it has to do with the syntactic Sugar of each Language. I 'll give you a
similar example I saw in a book for Haskel

The following program just returns the value of the position of a datatype Tuple
which can hold one or two elements.

data Tuple a b = One a | Two a b 
tuple1 (One a)= Just a
tuple1 (Two a b) = Just a

tuple2 (One a) = Nothing
tuple2 (Two a b) = Just b

The corresponding Version in C++, which seems to be more appropriate, would be
templateclass A, class B
struct Tuple
{
   enum (One, Two) tag;
   union
   {
  A either_one;
  struct nOne
  {
A either_two
B two;
  };
   };
}

Am I wrong. If not, how can I use it in the corresponding function in  C++? 
I seems realy strange, and I'm confused. 

Surely a solution to this would be to use the standard types of Haskel for
tuples and check out each time if I have just a number or a tuple. But this 
is how somebody thinks in imperative languages. Functional programming is
something more, isn't it?

Sorry for beeing so naive, but although unions, enum, structure are just 
some tools in C, surely something more in C++, in Haskell they are seem to be a
standard.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Datatypes - Haskell

2008-02-10 Thread Victor Nazarov
On Feb 10, 2008 3:40 PM, Mattes Simeon [EMAIL PROTECTED] wrote:
 Thanks for your help. It was very useful.

 Though in comparison with C or C++ I can't figure out so clear the syntax.
 Maybe it has to do with the syntactic Sugar of each Language. I 'll give you a
 similar example I saw in a book for Haskel

 The following program just returns the value of the position of a datatype 
 Tuple
 which can hold one or two elements.

 data Tuple a b = One a | Two a b
 tuple1 (One a)= Just a
 tuple1 (Two a b) = Just a

 tuple2 (One a) = Nothing
 tuple2 (Two a b) = Just b

 The corresponding Version in C++, which seems to be more appropriate, would be

I think this is the most native way to do it in C++:
template class A, class B
class Tuple {
public:
static TupleA, B *One (A *a) { return new One (a); }
static TupleA, B *Two (A *a, B *b) { return new Two (a, b); }
virtual A *tuple1 () = 0;
virtual B *tuple2 () = 0;
};

template class A, class B
class One : TupleA, B
{
public:
  One (A *a) { this-a = a; }
  A *tuple1 () { return a; }
  B *tuple2 () { return NULL; }
private:
  A *a;
}

template class A, class B
class Two: TupleA, B
{
public:
  Two (A *a, B *b) { this-a = a; this-b = b}
  A *tuple1 () { return a; }
  B *tuple2 () { return b; }
private:
  A *a;
  B *b;
}



-- 
vir
http://vir.comtv.ru/
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Datatypes - Haskell

2008-02-10 Thread ajb

G'day all.

On Feb 10, 2008 3:40 PM, Mattes Simeon [EMAIL PROTECTED] wrote:


Though in comparison with C or C++ I can't figure out so clear the syntax.


Quoting Victor Nazarov [EMAIL PROTECTED]:


I think this is the most native way to do it in C++:


Herb Sutter and Andrei Alexandrescu will find you and beat you up if
you write this.  This is considered more appropriate.  (Warning: untested
code follows.)

#include boost/variant.hpp

templatetypename A, typename B
class Tuple : public boost::variantA, std::pairA,B 
{
private:
typedef std::pairA,B pair_type;
typedef boost::variantA, pair_type base_type;

struct visitor_A : public boost::static_visitorconst A*
{
const A* operator()(const A a) { return a; }
const A* operator()(const pair_type p) { return p.first; }
};

public:

Tuple(const A a)
: base_type(a)
{
}

Tuple(const A a, const B b)
: base_type(pair_type(a,b))
{
}

const A* tuple1() const
{
return boost::apply_visitor(visitor_A(), *this);
}

const B* tuple2() const
{
const pair_type* p = boost::getpair_type(*this);
return p ? p-second : 0;
}
};

But in this specific case, this might be more appropriate:

templatetypename A,typename B
class Tuple
{
A m_a;
boost::optionalB m_b;
// etc
};

Cheers,
Andrew Bromage
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Datatypes - Haskell

2008-02-10 Thread Jason Dusek
Mattes Simeon [EMAIL PROTECTED] wrote:
 Though in comparison with C or C++ I can't figure out so clear
 the syntax...I seems realy strange, and I'm confused.

 Surely a solution to this would be to use the standard types
 of Haskel for tuples and check out each time if I have just a
 number or a tuple. But this is how somebody thinks in
 imperative languages. Functional programming is something
 more...

The data declarations in Haskell are well-suited to pattern
matching -- you have a compact way to express each alternative,
so you can match on that alternative. The C++ way offers a
*uniform* interface to every alternative, so you can do if-tests
that will type check. The do an if test at runtime way is very
general, but basically unoptimizable; whereas pattern matching
is very specific, and can be optimized (see page 5 of Luca
Cardelli's [Compiling ML]).


 Sorry for beeing so naive, but although unions, enum,
 structure are just some tools in C, surely something more in
 C++, in Haskell they are seem to be a standard.

It's certainly true that Haskell elevates certain common data
structures to the level of 'native citizens', providing short
cut syntax and so forth. Personally, I think C's approach is an
example of neglect in this domain, not sparseness; however, at
the time C was introduced, I would not have said the same thing
at all.

-- 
_jsn


[Compiling ML]: http://lucacardelli.name/Papers/CompilingML.pdf
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe