管道前进和后退
管道运算符用于以简单而优雅的方式将参数传递给函数。它允许消除中间值并使函数调用更容易阅读。
在 F#中,有两个管道运算符:
-
前进 (
|>
):从左到右传递参数let print message = printf "%s" message // "Hello World" will be passed as a parameter to the print function "Hello World" |> print
-
向后 (
<|
):从右到左传递参数let print message = printf "%s" message // "Hello World" will be passed as a parameter to the print function print <| "Hello World"
这是一个没有管道运算符的示例:
// We want to create a sequence from 0 to 10 then:
// 1 Keep only even numbers
// 2 Multiply them by 2
// 3 Print the number
let mySeq = seq { 0..10 }
let filteredSeq = Seq.filter (fun c -> (c % 2) = 0) mySeq
let mappedSeq = Seq.map ((*) 2) filteredSeq
let finalSeq = Seq.map (sprintf "The value is %i.") mappedSeq
printfn "%A" finalSeq
我们可以缩短前面的示例,并使用正向管道运算符使其更清晰:
// Using forward pipe, we can eliminate intermediate let binding
let finalSeq =
seq { 0..10 }
|> Seq.filter (fun c -> (c % 2) = 0)
|> Seq.map ((*) 2)
|> Seq.map (sprintf "The value is %i.")
printfn "%A" finalSeq
每个函数结果作为参数传递给下一个函数。
如果要将多个参数传递给管道运算符,则必须为每个附加参数添加|
,并使用参数创建元组。原生 F#管道运算符最多支持三个参数(|||>或<|||)。
let printPerson name age =
printf "My name is %s, I'm %i years old" name age
("Foo", 20) ||> printPerson