Python 参数数量可变的柯里化函数

Python curried function with variable number of arguments

给定 n,我想创建一个函数,它接受 n 元素并将它们 return 作为列表。一种方法:

def g(n):
  def f(*l):
    assert len(l) == n
    return l
  return f

我的问题:我希望 return 函数为 curried

结果会像这样工作,但对于所有 n:

def g(n):
    if n == 1: return lambda i: [i]
    if n == 2: return lambda i1: lambda i2: [i1, i2]
    if n == 3: return lambda i1: lambda i2: lambda i3: [i1, i2, i3]
    ...

我的第一个方法是这样的:

def g(n):
    if n == 1: return lambda i: [i]
    return lambda i: g(n-1) + [i]

这不起作用:g(n-1) return是一个函数,因此无法添加到列表中。有修复吗?

似乎我需要以某种方式将输入“传递”给 g(n-1),获取 g(n-1) 的输出,然后添加 [i],但我不知道如何“撬开”g(n-1) 进行定位,同时保持正确的输入类型。

我尝试在 python 中使用谷歌搜索柯里化,但我只得到了一些基本示例。我是函数式编程的新手,如果我的术语不足,请见谅。

我想到了这个:

def f(n, prev=None):
    if prev is None:
        prev = []

    if n == 1:
        return lambda x: prev + [x]
    else:
        return lambda x: f(n-1, prev=prev + [x])

# f(3) creates list with length 3
# other calls append one element to the list, until length 3 is reached
assert f(3)(1)(2)(3) == [1,2,3]