F#管道运算符如何工作

Dzm*_*voi 3 f# pipeline

有一个代码:

 //e = 1/2*Sum((yi -di)^2)
    let error y d =
        let map = 
            Array.map2 (fun y d -> (y - d) ** 2.0) y d
        let sum = 
            Array.sum map
        (sum / 2.0)

    let error2 y d =
        Array.map2 (fun y d -> (y - d) ** 2.0) y d
        |> Array.sum
        |> (/) 2.0
Run Code Online (Sandbox Code Playgroud)

我理解这些功能应该产生相同的结果,但结果有很大的不同.有谁能解释一下?

ps简化示例:

let test = [|1..10|]
    let res = test
                |> Array.sum
                |> (/) 5
Run Code Online (Sandbox Code Playgroud)

我希望test = 11(sum(1..10)= 55然后是55/5)但是在Array.sum管道不能正常工作之后(结果test = 0).

hej*_*oco 5

另一种方法是使用反向管道运算符(<|),以便按正确的顺序使用参数完成(/)的部分应用:

let error2 y d =
    Array.map2 (fun y d -> (y - d) ** 2.0) y d
    |> Array.sum
    |> (/) <| 2.0
Run Code Online (Sandbox Code Playgroud)

编辑:看看这是否有助于澄清

x/y = (/) x y = y |> (/) x = x |> (/) <| y
Run Code Online (Sandbox Code Playgroud)

所有这些都是等价的.管道运营商定义为:

(|>) x f = f x
(<|) f x = f x
Run Code Online (Sandbox Code Playgroud)

其中f是函数,x是某个值.反向管道看起来不是很多,但在某些情况下它可以帮助清理一些代码.