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 suc
onde 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 n
e um tipo, a
retorna o tipo de n
vezes que as listas aninhadas são a
, o mesmo L 3 Bool
seria 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 .agda
extensão para emacs permite uso C-c C-n
(avaliar termo à forma normal), de entrada, por exemplo, f 2 3
e obter a resposta correta em uma forma estranha: (3 ∷ []) ∷ []
. Agora, é claro, se você quiser fazer isso com strings, precisará importá-las ...