Агда, 173 байта
Поскольку тип возвращаемого значения функции зависит от числа, указанного в качестве аргумента, это явно тот случай, когда следует использовать язык с зависимой типизацией. К сожалению, игра в гольф нелегка на языке, где вы должны импортировать природные объекты и списки, чтобы использовать их. С положительной стороны, они используют sucтам, где я ожидал бы многословно succ. Итак, вот мой код:
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 ]
(Надеюсь, я нашел все места, где пробелы могут быть опущены.) L- это функция типа, которая задает натуральный nтип, и тип aвозвращает тип nвложенных списков a, умноженных на времена , так же L 3 Boolбудет и тип списков списков списков Bool(если бы мы имели импортировано Bool). Это позволяет нам выразить тип нашей функции как (n : ℕ) -> {a : Set} -> a -> L n a, где фигурные скобки делают этот аргумент неявным. Код использует более короткий способ написания этого типа. Теперь функция может быть определена очевидным образом путем сопоставления с шаблоном по первому аргументу.
Загрузка этого файла с .agdaрасширением в Emacs позволяет использовать C-c C-n(оценить срок к нормальной форме), вход для примера f 2 3и получить правильный ответ в неудобном виде: (3 ∷ []) ∷ []. Теперь, конечно, если вы хотите сделать это со строками, вы должны импортировать их ...