有一个函数f带有参数x 1,x 2,…,x n
–即 f:X 1 ×X 2 ×…×X n →Y
– currying将f重新定义为带有单个参数a 1的函数,该参数映射到另一个函数。这项技术对于部分应用很有用,例如具有pow
我们可以编写的curried 函数exp = pow(e)
。
例
假设我们有以下函数f接受三个参数(f:X 1 ×X 2 ×X 3 →Y):
def f(a,b,c):
return a + b * c
调用此函数将使我们留下f_curry:X 1 →(X 2 →(X 3 →Y)),如果我们现在两次调用该函数,f_curry(1)(2)
我们将得到一个h
等于以下返回值的函数():
def h(c):
return 1 + 2 * c
curried函数f
可以这样编写(Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
挑战
您的挑战将是如上所述咖喱函数,这是规则:
- 输入将是一个至少包含2个参数的黑盒函数
- 输入函数将始终具有固定数量的参数(不
printf
相同或相似,请注意:您需要支持参数数量≥2的函数) - 如果您的语言默认情况下使用咖喱函数(例如Haskell),则可能希望输入函数定义在N个元组之上,而不是“高阶函数”
- 您可以将参数数量作为输入
- 输出将是输入的等效咖喱数*
- 您可以假设输出函数只能是:
- 调用小于或等于输入函数采用的参数数量的函数
- 用正确类型的参数调用
*这将意味着对于f
带有N
参数的输入和h
对于所有有效参数的输出而言,a1,…,aN
它都具有该参数f(a1,a2,…,aN) == h(a1)(a2)…(aN)
。
def f(a,b,c): return a + b * c
,输出是def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(在某处定义),输出应为f_curry
。否则,输入为lambda a,b,c: a+b*c
,输出为等于的函数f_curry
。