Un esempio reale di utilizzo della funzione curry? [chiuso]

6

Mi è stato difficile trovare un esempio di vita reale utilizzando la funzione curry e ottenere il vantaggio di usare curry.

Quando eseguo la funzione di Google Curry, vedo spesso l'esempio

let add = x => y => x + y;
let add10 = add(10);
console.log(add10(20));

Devo dire che in questo esempio non vedo il valore dell'utilizzo di curry.

Dopo aver letto le risposte in questo SO link ho ancora non vedere il vantaggio di usarlo.

Ad esempio, la risposta con il punteggio più alto fornisce un esempio di convertitore, ma quell'esempio può essere riscritto senza curry come mostra un'altra risposta.

Ho letto anche le risposte Qual è il vantaggio del curry? (anche se la discussione non è limitata a javascript) ho ancora la sensazione che la versione curry possa essere riscritta senza curry (in js).

Quindi qualcuno può mostrarmi il "vero" vantaggio / beneficio dell'utilizzo di curry in javascript?

---- update ----

Ad eccezione delle risposte che ho trovato, ho trovato anche l'esempio del registro qui mostra il vantaggio di usarlo .

    
posta Qiulang 25.12.2018 - 04:30
fonte

2 risposte

6

Non ho quasi mai usato Currying, ma ecco un esempio recente in cui si è dimostrato utile. Stavo programmando il gioco Battlesnake , ma questo si applica a molti giochi. Ti forniscono vari array, dando la posizione del tuo serpente, dei serpenti nemici e del cibo. Diciamo che stai considerando di passare a un certo punto {x, y} e vuoi controllare se contiene un altro serpente, cibo o anche te stesso. Il primo passo sarebbe scrivere un codice come questo (userò un mix di funzione e nuove frecce con le frecce)

// utility function
function samePoint(p1, p2) {
  return (p1.x === p2.x) && (p1.y === p2.y);
}

e da qualche parte nel codice vai

let possibleMove = {x,y}; // where you are thinking of moving
...
if (foodArray.some((p) => samePoint(p, possibleMove )) {
  // this move looks tasty, give it a bonus value...
}

Non male, ma, dato che farai così tanti posti nel tuo codice, un po 'noioso e goffo. E, dalla mia esperienza, facile confondere i due argomenti.  :-( Il problema di fondo è che some() (o find() ) accetta una funzione che accetta solo un argomento singolo , e tu hai davvero bisogno di due argomenti , i due punti Quindi, pensi di currying! Qui molti userebbero le frecce, trovo le funzioni nidificate più chiare:

function samePointAs(p1) {
  return function(p2) {
    return samePoint(p1, p2);
  }
}

Quindi, il test "è quel cibo" diventa

let possibleMove = {x,y}; // where you are thinking of moving
...
if (foodArray.some(samePointAs(possibleMove )) {
  // this move looks tasty, give it a bonus value...
}

Questo ti renderà un milionario di Internet? Probabilmente no. Ma semplifica e, in questo caso, chiarisci il tuo codice.

    
risposta data 27.12.2018 - 19:30
fonte
14

Lavorare nel tuo esempio non ha molto senso, sono d'accordo. Per vedere la funzionalità del currying, è necessario combinarlo con le funzioni di ordine superiore: funzioni che richiedono un'altra funzione come parametro.

L'esempio più tipico di questo è la mappa, il filtro e la riduzione, anche se un'altra situazione comune sono i callback. Quando si applica parzialmente una funzione, è possibile passare la funzione parzialmente applicata a queste funzioni di ordine superiore. Il currying ha senso quando la maggior parte delle volte si vorrebbe usare una funzione per un'applicazione parziale, in modo che possa essere passata a un'altra funzione di ordine superiore.

Un esempio più illustrativo potrebbe apparire così:

let array1 = [1, 4, 9, 16];
let add = x => y => x + y;
array2 = array1.map(foo ? add(10) : add(20));

Il currying non è mai necessario, sì, dato che puoi sempre creare una funzione anonimo / freccia da una funzione normale quando ne hai bisogno, ma in alcune situazioni può essere molto conveniente avere una funzione al curry rispetto al normale (e in altre situazioni , è solo rendere le cose fastidiose e lente).

    
risposta data 25.12.2018 - 07:39
fonte

Leggi altre domande sui tag