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
答案 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