Memiliki fungsi f yang mengambil argumen x 1 , x 2 ,…, x n
- yaitu. f: X 1 × X 2 ×… × X n → Y
- currying mendefinisikan ulang f sebagai fungsi mengambil argumen tunggal a 1 yang memetakan fungsi lain. Teknik ini berguna untuk aplikasi parsial, misalnya dengan pow
fungsi kari yang bisa kita tulis exp = pow(e)
.
Contoh
Dengan asumsi kita memiliki fungsi berikut f mengambil tiga argumen ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
Menjelajahi fungsi ini membuat kita dengan f_curry: X 1 → (X 2 → (X 3 → Y)) , jika kita sekarang memanggil fungsi itu dua kali dengan f_curry(1)(2)
kita akan mendapatkan fungsi ( h
) setara dengan yang dikembalikan berikut:
def h(c):
return 1 + 2 * c
Fungsi kari f
dapat ditulis seperti ini (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Tantangan
Tantangan Anda adalah menjelajah fungsi seperti dijelaskan di atas, berikut adalah aturannya:
- Input akan berupa fungsi kotak hitam yang membutuhkan setidaknya 2 argumen
- Fungsi input akan selalu memiliki sejumlah argumen (tidak seperti
printf
atau mirip, catatan: Anda harus mendukung fungsi dengan sejumlah argumen ≥2) - Jika bahasa Anda menggunakan fungsi curried secara default (mis. Haskell), Anda mungkin mengharapkan fungsi input didefinisikan lebih dari N -tuple, alih-alih "fungsi urutan lebih tinggi"
- Anda dapat mengambil jumlah argumen sebagai input
- Output akan menjadi setara input kari *
- Anda dapat mengasumsikan bahwa fungsi output hanya akan:
- dipanggil dengan kurang atau sama dengan jumlah argumen yang diambil oleh fungsi input
- dipanggil dengan argumen dari tipe yang tepat
* Ini berarti input f
dengan N
argumen dan output h
yang untuk semua argumen valid a1,…,aN
itu berlaku f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
dan outputnya def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(yang didefinisikan di suatu tempat) dan output harus setara dengan f_curry
. Atau inputnya lambda a,b,c: a+b*c
dan output fungsi yang setara f_curry
.