Come altri hanno menzionato che la pipeline è più simile a una pipeline di shell UNIX. Ti lasciamo scrivere alcuni input seguiti da operazioni che dovrebbero essere applicate ad esso, invece delle solite chiamate di funzioni annidate. In questo esempio, il codice standard F # sarebbe simile a questa:
let r = List.map (add 10) (List.filter (fun n-> n%2 <> 0) nums)
Nota che l'ingresso nums
è profondamente annidato nell'espressione e non è facile vedere che viene prima filtrata e poi proiettata. Usando il pipelining, puoi scrivere il codice in modo diverso, ma significherà esattamente la stessa cosa.
Il trucco è che l'operatore di pipelining accetta due parametri utilizzando la notazione infisso (ad esempio x |> f
). Il parametro x
verrà passato come ultimo argomento a una funzione a destra (f
). È possibile utilizzare il pipelining con qualsiasi # funzioni 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 su F # operatore pipelining è che non è un qualsiasi speciale built-in funzione della lingua.Si tratta di un semplice operatore personalizzato che è possibile definire da soli:
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
fonte
2010-02-01 18:50:08
Pensate più come la pipeline in PowerShell o gusci tradizionali (anche se, se si considera che gli oggetti vengono passati è davvero più simile a PowerShell). Non ha nulla a che fare direttamente con la pipeline della CPU :-) – Joey
@Johannes: vuoi dire qualcosa del genere ... cat myfile | più, l'input da uno viene passato all'output per essere elaborato da più? – t0mm13b
Esattamente. Anche se, come detto, l'analogia della shell UNIX è piuttosto errata per questo. – Joey