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]
给定 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]