Como otros mencionaron, la canalización es más como una tubería de shell de UNIX. Le permite escribir una entrada seguida de las operaciones que se le deben aplicar, en lugar de las llamadas a funciones anidadas habituales. En este ejemplo, el F # código estándar se vería así:
let r = List.map (add 10) (List.filter (fun n-> n%2 <> 0) nums)
Tenga en cuenta que la entrada nums
está profundamente anidado en la expresión y no es fácil ver que se filtra primero y luego proyecta. Al utilizar la canalización, puede escribir el código de manera diferente, pero significará exactamente lo mismo.
El truco es que el operador de canalización toma dos parámetros utilizando la notación infija (por ejemplo, x |> f
). El parámetro x
se pasará como último argumento a una función a la derecha (f
). Puede utilizar la canalización con cualquier función F #:
let sinOne = 1.0 |> sin
let add a b = a + b
let r = 10 |> add 5 // it doesn't always make code more readable :-)
Un punto importante sobre F # operador de la canalización es que no es ningún daño especial característica integrada de la lengua.Es un operador personalizado simple que se puede definir por su cuenta:
let (|>) x f = f x
// Thanks to operator associativity rules, the following:
let r = 1.0 |> sin |> sqrt
// ...means this:
let r = (1.0 |> sin) |> sqrt
Piense en lo más parecido a la tubería en PowerShell o conchas tradicionales (aunque, teniendo en cuenta que los objetos se pasan en realidad es más parecido a PowerShell). No tiene nada que ver directamente con el pipeline de la CPU :-) – Joey
@Johannes: quieres decir algo como esto ... cat myfile | más, la entrada de uno se pasa a la salida para ser procesada por más? – t0mm13b
Exactamente. Aunque, como se dijo, la analogía con el shell de UNIX es bastante deficiente para esto. – Joey