仮に動的に型を判別できたとしても、無理っぽい気がします。
リストかどうかを判別する関数
val islist = fn : 'a -> bool
が組み込み関数であったとします。
で、以下のような関数をSML/NJに入力してみました。


- fun islist _ = true;  (* とりあえず *)
val islist = fn : 'a -> bool

- fun flat [] = []
= | flat (x::xs) = (if (islist x) then (flat x) else [x])@(flat xs);
stdIn:25.38-25.46 Error: operator and operand don't agree [circularity]
 operator domain: 'Z list
 operand:     'Z
 in expression:
  flat x


というような反応なので、やはり関数の型がまずいと思います。