2012-04-10 28 views
11

Me parece que todos estos están relacionados. ¿Cuál es la diferencia?Tubería, Composición y Currying

+5

¿Tiene algún ejemplo que necesite encontrar un enfoque apropiado? Tu pregunta es bastante amplia. – pad

+2

Esto podría ajustarse más al sitio SO de los "programadores". –

+0

Estoy de acuerdo con Pad - esta es una pregunta bastante abierta (las respuestas de Tomas y Daniel no se sostienen). –

Respuesta

37
  • La tubería se utiliza para realizar una secuencia de operaciones con algún valor (como las tuberías en Unix). La entrada a cada función es la salida de la función anterior. Obviamente, esto requiere que cada función tome una sola arg.

  • Composición (<</>>) es similar en que llama dos funciones en secuencia (es decir, la salida de la primera es la entrada a la segunda) pero devuelve una función en lugar de invocar inmediatamente la secuencia.

  • Currying crea una nueva función mediante la aplicación de 1 a N -1 args a una función de N args

Así, la composición de pellejo se utilizan para crear funciones mientras que las tuberías se utiliza para invocación. La composición y el currying difieren en la forma en que crean nuevas funciones (aplicando args vs encadenamiento).

25

Además de lo que escribió Daniel, hay una muy estrecha correspondencia entre la tubería (los |> y <| operadores) y la composición de funciones (las >> y << operadores).

Cuando se utiliza la tubería para pasar algunos datos a un seqence de funciones:

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

..., entonces este es equivalente a pasar la entrada a una función obtenida utilizando la composición de funciones:

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

composed nums 

En la práctica, esto a menudo significa que puede reemplazar la declaración de función que utiliza tuberías en el argumento con una composición de funciones (y usa el hecho de que las funciones se pueden usar como valores). Aquí hay un ejemplo:

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

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