#define r(a,b)for(j=0;j<i;)printf("%s"#a,j++?","b" (",97+j); main(i,j){for(;++i<27;puts(")\n")){r(Monoid %c," ":"instance")r(%c,:") => Monoid")r(mempty,:") where\n mempty =")r(%c1,:")\n ")r(%c2,:") `mappend`")r(%c1 `mappend` %2$c2,:") =")}}
Note that non-ascii characters in the above source code will be escaped (such as \x9f).