2012-04-10 16 views
11

Mi sembra che tutti questi siano correlati. Qual è la differenza?Piping, composizione e curring

+5

Avete qualche esempio che deve trovare un approccio appropriato? La tua domanda è abbastanza ampia. – pad

+2

Questo potrebbe adattarsi maggiormente al sito SO dei "programmatori". –

+0

Sono d'accordo con Pad: questa è una domanda abbastanza aperta (le risposte di Tomas e Daniel non reggono). –

risposta

37
  • tubazione viene utilizzata per eseguire una sequenza di operazioni su un certo valore (come tubazioni in Unix). L'input per ogni funzione è l'output della funzione precedente. Ovviamente questo richiede che ciascuna funzione prenda un singolo arg.

  • Composizione (<</>>) è simile dal fatto di prevedere due funzioni in sequenza (cioè, l'uscita del primo è l'ingresso al secondo), ma restituisce una funzione anziché immediatamente invocando la sequenza.

  • Currying crea una nuova funzione applicando 1 a N -1 args ad una funzione di N args

Quindi, composizione e rifinizione vengono utilizzate per creare funzioni che viene utilizzato per tubazioni invocazione. La composizione e il curry differiscono nel modo in cui creano nuove funzioni (applicando args vs concatenamento).

25

Oltre a quanto scritto Daniel, v'è una stretta corrispondenza tra tubazione (i |> e <| operatori) e la composizione funzione (le >> e << operatori).

Quando si utilizza tubazioni per passare alcuni dati ad un seqence di funzioni:

nums |> Seq.filter isOdd 
    |> Seq.map square 
    |> Seq.sum 

... allora questo è equivalente a passare l'input ad una funzione ottenuto con funzione composizione:

let composed = 
    Seq.filter isOdd 
    >> Seq.map square 
    >> Seq.sum 

composed nums 

In pratica, ciò significa spesso che è possibile sostituire la dichiarazione di funzione che utilizza piping sull'argomento con una composizione di funzioni (e utilizzare il fatto che le funzioni possono essere utilizzate come valori). Ecco un esempio:

// Explicit function declaration 
foo (fun x -> x |> bar |> goo) 

// Equivalent using function composition 
foo (bar >> goo)