Agda, 173 bytes
Como o tipo de retorno da função depende do número fornecido como argumento, este é claramente um caso em que uma linguagem tipicamente dependente deve ser usada. Infelizmente, o golfe não é fácil em um idioma em que é necessário importar listas e naturais para usá-los. No lado positivo, eles usam suconde eu esperava o verboso succ. Então, aqui está o meu código:
module l where
open import Data.List
open import Data.Nat
L : ℕ -> Set -> Set
L 0 a = a
L(suc n)a = List(L n a)
f : ∀ n{a}-> a -> L n a
f 0 x = x
f(suc n)x = [ f n x ]
(Espero encontrar todos os lugares onde os espaços podem ser omitidos.) LÉ uma função de tipo que, dada uma natural ne um tipo, aretorna o tipo de nvezes que as listas aninhadas são a, o mesmo L 3 Boolseria o tipo de listas de listas de listas de Bool(se tivéssemos importado Bool). Isso nos permite expressar o tipo de nossa função como(n : ℕ) -> {a : Set} -> a -> L n a , onde os chavetas tornam esse argumento implícito. O código usa uma maneira mais curta de escrever esse tipo. A função agora pode ser definida de maneira óbvia pela correspondência de padrões no primeiro argumento.
Carregando este arquivo com uma .agdaextensão para emacs permite uso C-c C-n(avaliar termo à forma normal), de entrada, por exemplo, f 2 3e obter a resposta correta em uma forma estranha: (3 ∷ []) ∷ []. Agora, é claro, se você quiser fazer isso com strings, precisará importá-las ...