つーか、任意の深さのlistをflatするのは
overloadingしないと無理っぽいと思うぞ。
だって、flat関数の型を決定できないじゃん。

で、これはMLが非力ってんじゃなくて、
型安全への立場の違いの現れにすぎない。
C++のtemplateを使うと、bodyをinstantiateするまでは
型安全性を検査できないが、
MLは関数を定義するたびにその型安全性を検査できる。
この違いは大きい。