deepUncons :: (a -> Maybe (b,a)) -> a -> [b]
deepUncons un x = f (un x) where {
f Nothing = []; f (Just (y,z)) = y : f (un z)
}

リストに変換してパターンマッチすればよい
そもそも型クラスだらけにならない