管道前进和后退

管道运算符用于以简单而优雅的方式将参数传递给函数。它允许消除中间值并使函数调用更容易阅读。

在 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