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