Apa perbedaan antara aplikasi fungsi currying dan fungsi parsial dalam praktiknya


8

Saya mengerti perbedaan antara aplikasi fungsi parsial dan fungsi curry ( f(X x Y x Z) -> Nvs f(X -> (Y -> (Z -> N)))), tapi saya tidak melihat apa konsekuensi dari perbedaan ini ketika mengembangkan perangkat lunak.

Jawaban:


5

Awalnya, currying adalah untuk menyederhanakan analisis, daripada teknik pemrograman praktis; dalam kalkulus lambda, semua fungsi adalah unary. Currying sering digunakan pada level bahasa untuk alasan yang sama: menyederhanakan model komputasi.

Aplikasi parsial digunakan ketika fungsi bernama, berguna dapat diimplementasikan dalam hal fungsi lain yang lebih umum hanya dengan memperbaiki argumen.

Mereka tetap bentuk yang berbeda, yang melibatkan berbagai bagian perhitungan. Mempertimbangkan:

x=>y=>z=>f(x,y)
(y,z)=>f(0,y,z)

Perhatikan bahwa fungsi curried tidak memiliki nilai yang terikat pada argumen dan mengambil argumen dalam urutan tertentu; setelah Anda menjelajah suatu fungsi, Anda tidak menjilat hasilnya dan tidak mengubah urutan fungsi yang mengambil argumen (meskipun Anda bisa memburamkan dan menjilat untuk melakukannya). Fungsi parsial, sebaliknya, memiliki nilai yang terikat dengan argumen dan selanjutnya dapat diterapkan sebagian di sepanjang argumen yang tersisa.

Menerapkan fungsi curry dekat dengan aplikasi parsial (Anda tidak, setelah semua, curry fungsi dan biarkan itu; pada suatu titik, Anda akan menerapkannya), yang mana penggunaan mulai menyeberang. Ketika Anda melakukan ini, currying hanyalah langkah pertama dari dua langkah menuju aplikasi parsial.


2

Saya percaya bahwa pertanyaan Anda dapat diulangi sebagai: mengapa bahasa memiliki currying?

Sebagian besar masalah kenyamanan:

Di Ocaml, Anda bisa membuat kode

 let sum3 x y z = x + y + z;;
 let foo xx yy ll = List.map (sum3 xx yy) ll;;

Dalam Skema Anda harus secara eksplisit membuat fungsi anonim

 (define (sum3 x y z) (+ x y z))
 (define (foo xx yy ll) (map (lambda (zz) (sum3 xx yy zz)) ll))  

Bahasa dengan aplikasi parsial & kari perlu praktis untuk memiliki optimasi untuk menghindari membuat penutupan parsial di mana-mana; Anda tidak ingin implementasi selalu berlaku sum3seolah-olah itu didefinisikan sebagai

 let sum3 x = 
    fun y -> 
      (fun z -> x + y + z)

yaitu, untuk mengalokasikan 2 penutupan menengah saat komputasi sum3 1 2 3(dipahami dan diuraikan sebagai ((sum3 1) 2) 3...). Anda ingin jumlahnya dihitung segera.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.