Как уже упоминалось, конвейеризация больше похожа на конвейер оболочки 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