Как другие упомянутые, конвейерная обработка больше похожа на конвейер UNIX. Это позволит вам написать некоторый ввод, за которым следуют операции, которые должны быть применены к нему, вместо обычных вызовов вложенных функций. В этом примере стандартный F # код будет выглядеть следующим образом:
let r = List.map (add 10) (List.filter (fun n-> n%2 <> 0) nums)
Обратите внимание, что вход nums
глубоко вложенной в выражении, и это не так легко увидеть, что сначала фильтруется, а затем проецируется. Используя конвейерную обработку, вы можете написать код по-другому, но это будет означать одно и то же.
Хитрость заключается в том, что оператор конвейерной обработки принимает два параметра с использованием инфиксной нотации (например, x |> f
). Параметр x
будет передан как последний аргумент функции справа (f
). Вы можете использовать конвейерный с любыми функциями 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 :-)
Важны о F операторе # конвейерных является то, что это не каким-либо специальным встроенными функциями языка.Это простой пользовательский оператор, который можно определить по своему усмотрению:
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
думать о нем, как трубопровод в PowerShell или традиционных оболочек (хотя, учитывая, что объекты передаются это действительно больше похоже на PowerShell). Он не имеет ничего общего с конвейером CPU :-) – Joey
@Johannes: вы имеете в виду что-то вроде этого ... cat myfile | больше, вход от одного передается на вывод, который будет обрабатываться больше? – t0mm13b
Точно. Хотя, как сказано, аналогия с UNIX-оболочкой довольно ошибочна для этого. – Joey