data S = <a>($) | <b>($);
data T = ( <a>($) . <b>($) ) | ( <b>($) . <a>($) );

f( x :: T ) = g(x);
g( a :: S . b :: S) = a.b;
