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

Luk*_* Xu 3 f#

let J = (-1.0 * y) .* MatrixMath.log  <| Activation.sigmoid (X * theta)
let J = (-1.0 * y) .* MatrixMath.log  (Activation.sigmoid (X * theta))
Run Code Online (Sandbox Code Playgroud)

我有以下两组代码与前者给出一个编译错误说"这个功能需要太多的争论",但后者工作正常.

我认为管道向后运营商的目标主要是改变我正在尝试做的评估顺序.

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

编辑:

MatrixMath.log就是这么做的

type MatrixMath =
    static member log X = X |> Matrix.map log
    static member log X = X |> Vector.map log
Run Code Online (Sandbox Code Playgroud)

scr*_*wtp 5

管道操作员的优先级较低.您尝试评估的是这样的:

let J = ((-1.0 * y) .* MatrixMath.log) <| (Activation.sigmoid (X * theta))
Run Code Online (Sandbox Code Playgroud)

或类似的暴行.

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

let J = (-1.0 * y) .* (MatrixMath.log <| Activation.sigmoid <| X * theta)
Run Code Online (Sandbox Code Playgroud)

或者分成两行:

let J = 
    let K = MatrixMath.log <| Activation.sigmoid (X * theta)
    (-1.0 * y) .* K
Run Code Online (Sandbox Code Playgroud)

  • 我会保留括号.我学到的一件事是永远不要依赖记忆操作员规则.把它放在画面之外是如此简单,所以为什么要这么麻烦. (2认同)