向后管道(即“<|”)是如何工作的?

How does the backwards pipeline (i.e. "<|") really work?

我需要帮助来理解“<|”针对以下代码的行为:

Prop.forAll fiveAndThrees <| fun number ->

    let actual = transform number

    let expected = "FizzBuzz"
    expected = actual

文档说明如下:

Passes the result of the expression on the right side to the function on left side (backward pipe operator).

fiveAndThrees 不是一个函数而是一个值,它位于运算符的左侧。

我把上面的定义解释为:

获取名为 "number" 的输入并将其输入 "transform" 函数。但是,如果我们将右侧表达式的结果传递给左侧的函数,那么输入(即数字)何时以及如何实际初始化?

我就是没看到。

完整测试如下:

[<Fact>]
let ``FizzBuzz.transform returns FizzBuzz`` () =
    let fiveAndThrees = Arb.generate<int> |> Gen.map ((*) (3 * 5)) 
                                          |> Arb.fromGen

    Prop.forAll fiveAndThrees <| fun number ->

        let actual = transform number

        let expected = "FizzBuzz"
        expected = actual

待测函数如下:

let transform number =  
    match number % 3, number % 5 with 
    | 0, 0 -> "FizzBuzz" 
    | _, 0 -> "Buzz" 
    | 0, _ -> "Fizz" 
    | _ -> number.ToString() 

<| 是一个运算符,其绑定不如函数应用程序紧密,因此

Prop.forAll fiveAndThrees <| fun number -> ...

被解析为

(Prop.forAll fiveAndThrees) <| fun number -> ...

Prop.forAll 有两个参数,一个 Arbitrary<T> 和一个函数 T -> Testable 所以 Prop.forAll fiveAndThrees 是一个传递给右边的函数。