引数x 1、x 2、…、x nをとる関数fを持つ
–すなわち。 f:X 1 ×X 2 ×…×X n →Y
– カリー化は、fを、さらに別の関数にマップする単一の引数a 1をとる関数として再定義します。このテクニックは、部分的に適用する場合に便利です。たとえば、カリー化したpow
関数を使用して記述できますexp = pow(e)
。
例
3つの引数(f:X 1 ×X 2 ×X 3 →Y)を取る次の関数fがあると仮定します。
def f(a,b,c):
return a + b * c
この関数をカリー化すると、f_curryが残ります:X 1 →(X 2 →(X 3 →Y))、その関数を2回呼び出すと、次と同等のf_curry(1)(2)
関数(h
)が返されます:
def h(c):
return 1 + 2 * c
カリー化された関数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
ます。