On Thu, Apr 5, 2012 at 01:53, Sutherland, Julian <
julian.sutherlan...@imperial.ac.uk> wrote:

> data Tree = Node Left Right | Leaf
>
> Could be converted to a struct in C/C++:
>
> struct Tree {
>     struct Tree* left;
>     struct Tree* right;
> };
>

Shouldn't this actually be a tagged union?  Not that they exist as such in
C/C++, but are easy enough to emulate (minus the extra type checking that
real tagged unions such as even Pascal gives you):

    struct Tree {
      enum {Node, Leaf} tag;
      /* possibly tag sanity checking macros defined here */
      union {
        struct {
          struct Tree *tree_Node_left;
    #ifdef HSC_CHECKED
    #  define tree_left(tree) (tree->tag == Leaf ? _hsc_abort("tree:
Node.left of Leaf") : tree->_tree_Node.tree_Node_left)
    #else
    #  define tree_left(tree) tree->_tree_Node.tree_Node_left
    #endif
          struct Tree *tree_Node_right;
    #ifdef HSC_CHECKED
    #  define tree_right(tree) (tree->tag == Leaf ? _hsc_abort("tree:
Node.right of Leaf") : tree->_tree_Node.tree_Node_right)
    #else
    #  define tree_right(tree) tree->_tree_Node.tree_Node_right
    #endif
        } _tree_Node;
        /* strictly we can collapse out the union here because Leaf has no
data */
      } _tree_data;

Similarly several of your other examples could use a bit more thought.

-- 
brandon s allbery                                      allber...@gmail.com
wandering unix systems administrator (available)     (412) 475-9364 vm/sms
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to