Saya punya banyak pertanyaan saat belajar dan sejak itu telah ditanyakan berkali-kali. Cara paling sederhana yang bisa saya jelaskan perbedaannya adalah bahwa keduanya sama-sama :) Mari saya jelaskan ... jelas ada perbedaan.
Baik aplikasi parsial maupun currying melibatkan penyediaan argumen ke suatu fungsi, mungkin tidak sekaligus. Contoh yang cukup kanonik adalah menambahkan dua angka. Dalam pseudocode (sebenarnya JS tanpa kata kunci), fungsi dasar mungkin sebagai berikut:
add = (x, y) => x + y
Jika saya ingin fungsi "addOne", saya bisa menerapkannya sebagian atau menjilatnya:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Sekarang menggunakannya jelas:
addOneC(2) #=> 3
addOneP(2) #=> 3
Jadi apa bedanya? Yah, itu halus, tetapi aplikasi parsial melibatkan penyediaan beberapa argumen dan fungsi yang dikembalikan kemudian akan menjalankan fungsi utama pada doa berikutnya sedangkan currying akan terus menunggu sampai memiliki semua argumen yang diperlukan:
curriedAdd = curry(add) # notice, no args are provided
addOne = curriedAdd(1) # returns a function that can be used to provide the last argument
addOne(2) #=> returns 3, as we want
partialAdd = partial(add) # no args provided, but this still returns a function
addOne = partialAdd(1) # oops! can only use a partially applied function once, so now we're trying to add one to an undefined value (no second argument), and we get an error
Singkatnya, gunakan aplikasi parsial untuk mengambil beberapa nilai, mengetahui bahwa saat Anda memanggil metode berikutnya, itu akan mengeksekusi, meninggalkan semua argumen yang tidak ditentukan tidak ditentukan; gunakan currying ketika Anda ingin terus mengembalikan fungsi yang diterapkan sebagian sebanyak yang diperlukan untuk memenuhi tanda tangan fungsi. Satu contoh akhir yang dibuat:
curriedAdd = curry(add)
curriedAdd()()()()()(1)(2) # ugly and dumb, but it works
partialAdd = partial(add)
partialAdd()()()()()(1)(2) # second invocation of those 7 calls fires it off with undefined parameters
Semoga ini membantu!
UPDATE: Beberapa bahasa atau implementasi lib akan memungkinkan Anda untuk lulus arity (jumlah total argumen dalam evaluasi akhir) ke implementasi aplikasi parsial yang dapat mengubah dua deskripsi saya menjadi kekacauan yang membingungkan ... tetapi pada saat itu, kedua teknik tersebut sebagian besar dipertukarkan.