And i forgot to include the defs of (co)prod:<br>
<br>coprod (&lt;&gt;) i1 i2 = (\a b -&gt; i1 a &lt;&gt; i2 b)<br>prod   (&gt;&lt;) p1 p2 = (\a   -&gt; p1 a &gt;&lt; p2 a)<br><br>diag = foldr (curry (prod mappend<br>                            fst<br>                            snd<br>
        . uncurry (coprod mappend<br>                            (splitAt 2)<br>                            (splitAt 1)))) []<br><br>Matt<br>