有一个代码:
//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).
另一种方法是使用反向管道运算符(<|),以便按正确的顺序使用参数完成(/)的部分应用:
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是某个值.反向管道看起来不是很多,但在某些情况下它可以帮助清理一些代码.