リストのネストの深さ

例えば、Double のリストのリストのリストの…、と何重かに入れ子になったリストに対して、入れ子の深さを計算する関数は書けるのか?そういう関数があれば、引数の型はなんになるのか?確定しないからダメな気がする。
でも、多重リスト自体は実際存在するし、それぞれ型が決まってるからその深さも確定しているはず。何とか出せないもんかな。
ほんのちょっとだけやってみた記録。

-- リストの深さ1のところをほどく
concat1 = concat

-- リストの深さ2の所をほどく
concat2 [] = []
concat2 (x:xs) = ((concat1 x) : (concat2 xs))

-- リストの深さ3の所をほどく
concat3 [] = []
concat3 (x:xs) = ((concat2 x) : (concat3 xs))

-- concatN n xs
-- リストの深さnの所をほどく? -- コンパイルエラー
concatN _ [] = []
concatN 1 xs = concat xs
concatN n (x:xs) = ((concatN n-1 x) : (concatN n xs))