f# - F# 管道运算符的工作原理

标签 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

据我了解,这些函数应该产生相同的结果,但结果存在很大差异。谁能解释一下?

附言简化示例:
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/

相关文章:

optimization - 这个质数生成器的执行时间可以提高吗?

arrays - f# 交换 Array2D 中的元素

c# - NET 世界的 Jetty

generics - F#成员约束+ ^ a byref参数

linux - 如何通过 ZIP 管道传输并在存档中使用可用的文件名

C# - 管道样式事件模型

c++ - 管道输入数据

f# - 如何在F#项目中管理资源?

database - Sitecore 外部数据库集成

python - 从 Scrapy 管道中删除重复的项目?