Агда, 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 ∷ []) ∷ []. Звичайно, якщо ви хочете зробити це за допомогою рядків, вам доведеться імпортувати їх ...