有一个代码:
//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
据我了解,这些函数应该产生相同的结果,但结果存在很大差异。谁能解释一下?
附言简化示例:
let test = [|1..10|]
let res = test
|> Array.sum
|> (/) 5
我期望 test = 11 (sum(1..10) = 55 然后是 55/5) 但在 Array.sum 管道没有按我想要的方式工作之后(结果测试 = 0)。
最佳答案
另一种选择是使用反向管道运算符 (<|),以便 (/) 的部分应用以正确的顺序使用参数完成:
let error2 y d =
Array.map2 (fun y d -> (y - d) ** 2.0) y d
|> Array.sum
|> (/) <| 2.0
编辑:看看这是否有助于澄清
x/y = (/) x y = y |> (/) x = x |> (/) <| y
所有这些都是等价的。管道运算符定义为:
(|>) x f = f x
(<|) f x = f x
其中 f 是一个函数,x 是某个值。反向管道看起来没什么用,但它可以在某些情况下帮助清理一些代码。
关于f# - F# 管道运算符的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970823/