On Thu, Apr 5, 2012 at 01:53, Sutherland, Julian <julian.sutherland10@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                                      allbery.b@gmail.com
wandering unix systems administrator (available)     (412) 475-9364 vm/sms