
I have often found myself wishing for a small extension to the syntax of Haskell 'data' declarations. It goes like this: data <as usual> = <as usual> | ... | <as usual> +++ where type <tvar> = <type> type <tvar> = <type> ... deriving <as usual> Even something like binary search trees would, to me, be clearer as data BST key val = Empty | Fork key val bst bst where type bst = BST key val because this establishes an *essential* identity between the 3rd and 4th Fork argument types, rather than an "accidental" identity. I can't set this up using 'type' outside the 'data' declaration, because it has to refer to the type arguments of BST. Semantically, this is just an abbreviation mechanism with no consequences of any kind outside the 'data' declaration itself. The only point would be to make reading and writing 'data' declarations easier, especially large ones.