Comprendo la differenza tra l'applicazione della funzione parziale e una funzione al curry ( f(X x Y x Z) -> N
rispetto a f(X -> (Y -> (Z -> N)))
), ma non vedo quale sia la conseguenza di questa differenza nello sviluppo del software.
In origine, il curriculum era di semplificare l'analisi, piuttosto che una tecnica di programmazione pratica; nel calcolo lambda, tutte le funzioni sono unate. Il currying viene spesso utilizzato a livello di lingua per un motivo simile: semplificazione del modello di calcolo.
L'applicazione parziale viene utilizzata quando una funzione utile, denominata, può essere implementata in termini di un'altra funzione più generale semplicemente fissando un argomento.
Restano forme distinte, che coinvolgono diverse parti del calcolo. Prendere in considerazione:
x=>y=>z=>f(x,y)
(y,z)=>f(0,y,z)
Si noti che una funzione al curry non ha alcun valore associato agli argomenti e accetta gli argomenti in un ordine specifico; una volta che si curry una funzione, non si curry il risultato e non modificare l'ordine in cui la funzione accetta argomenti (anche se è possibile non essere pronti e curry per farlo). Una funzione parziale, al contrario, ha valori legati agli argomenti e può essere ulteriormente applicata parzialmente a qualsiasi argomento rimanente.
L'applicazione di una funzione al curry è vicina all'applicazione parziale (dopo tutto non si esegue una funzione curry e si lascia a questo punto, a un certo punto la si applica), che è dove gli usi iniziano ad attraversare al di sopra di. Quando lo fai, currying è solo il primo dei due passaggi verso un'applicazione parziale.
Credo che la tua domanda possa essere riformulata come: perché le lingue hanno curriculum?
È principalmente una questione di convenienza:
In Ocaml, puoi codificare
let sum3 x y z = x + y + z;;
let foo xx yy ll = List.map (sum3 xx yy) ll;;
In Scheme dovrai eseguire esplicitamente una funzione anonima
(define (sum3 x y z) (+ x y z))
(define (foo xx yy ll) (map (lambda (zz) (sum3 xx yy zz)) ll))
Lingue con applicazioni parziali e amp; il curry necessita praticamente di un'ottimizzazione per evitare di creare chiusure parziali ovunque; non vuoi che l'implementazione sempre applichi sum3
come se fosse definita come
let sum3 x =
fun y ->
(fun z -> x + y + z)
cioè, per assegnare 2 chiusure intermedie quando si calcola sum3 1 2 3
(inteso e analizzato come ((sum3 1) 2) 3
...). Vuoi che la somma venga calcolata immediatamente.
Leggi altre domande sui tag functions functional-programming currying