我正在玩Prefix
and Postfix
运算符(@
and //
分别),我遇到了以下问题。
给定以下代码,它们以完全相同的方式进行评估:
Hold[MatrixPlot@Sort@data] // FullForm
(* Hold[MatrixPlot[Sort[data]]] *)
Hold[data // Sort // MatrixPlot] // FullForm
(* Hold[MatrixPlot[Sort[data]]] *)
但是,给出以下表达式,我得到不同的结果:
FunctionExpand@Abs'[0]
(* Abs'[0] *)
Abs'[0] // FunctionExpand
(* 0 *)
我不太确定这是为什么。在我拥有的数十个其他代码片段中,f@expr
, expr // f
, and f[expr]
全部计算出相同的结果。为什么这个特殊案例会给出这样的结果?
这是一个优先级问题。 @ 的优先级高于//。要查看发生了什么,请将光标放在FunctionExpand
在这两种情况下,都可以使用 cmd+. (在 OS X 上)或 ctrl+。在其他任何事情上,你最终都会按优先级选择事情。
另一种查看它的方法是使用Trace
:
FunctionExpand@Abs'[0] // Trace
(*
-> {{{FunctionExpand[Abs],Abs},Abs^\[Prime]},(Abs^\[Prime])[0]}
*)
while
Abs'[0] // FunctionExpand//Trace
(*
-> {FunctionExpand[(Abs^\[Prime])[0]],0}
*)
特别是,请注意在第一种情况下 mma 首先如何评估FunctionExpand[Abs]
,得到Abs
,然后继续。这正是由于多么强烈@
与相比结合//
.
编辑:受到@Leonid评论的启发,这也提供了信息:
Hold[FunctionExpand@Abs'[0]] // FullForm
Hold[Abs'[0] // FunctionExpand] // FullForm
(*
-> Hold[Derivative[1][FunctionExpand[Abs]][0]]
Hold[FunctionExpand[Derivative[1][Abs][0]]]
*)
这更好地展示了正在发生的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)