为什么管道后向运算符在这种情况下不起作用? F#

时间:2016-03-13 20:59:14

标签: f#

let J = (-1.0 * y) .* MatrixMath.log  <| Activation.sigmoid (X * theta)
let J = (-1.0 * y) .* MatrixMath.log  (Activation.sigmoid (X * theta))

我有以下两组代码,前者给出了编译错误说&#34;这个函数需要太多的争论&#34;,但后者工作正常。

我认为管道向后操作员的目标主要是改变我正在尝试做的评估顺序。

如何在不使用括号的情况下编写表达式?

编辑:

MatrixMath.log就是这样做的

type MatrixMath =
    static member log X = X |> Matrix.map log
    static member log X = X |> Vector.map log

2 个答案:

答案 0 :(得分:5)

管道运算符的优先级较低。你试图评估的是这样的:

let J = ((-1.0 * y) .* MatrixMath.log) <| (Activation.sigmoid (X * theta))

或类似的暴行。

如果你真的需要在那里放管,请尝试这样的事情:

let J = (-1.0 * y) .* (MatrixMath.log <| Activation.sigmoid <| X * theta)

或分为两行:

let J = 
    let K = MatrixMath.log <| Activation.sigmoid (X * theta)
    (-1.0 * y) .* K

答案 1 :(得分:3)

在F#(<|)运算符中已经保留了关联性,所以你的表达式解析如下:

let J = ((-1.0 * y) .* MatrixMath.log) <| Activation.sigmoid (X * theta)

如果你反对括号,你可能会改写这样的代码:

(*not tested*)
let flip f a b = f b a
let J = MatrixMath.log <| Activation.sigmoid (X * theta) |> flip (.*) <| -1.0 * y