在Mathematica中使用f @ expr和expr // f的不同结果

Mik*_*ley 5 wolfram-mathematica

我被玩弄的PrefixPostfix运营商(@//分别),我遇到了以下问题.

鉴于以下代码,他们以相同的方式进行评估:

Hold[MatrixPlot@Sort@data] // FullForm
(* Hold[MatrixPlot[Sort[data]]] *)

Hold[data // Sort // MatrixPlot] // FullForm
(* Hold[MatrixPlot[Sort[data]]] *)
Run Code Online (Sandbox Code Playgroud)

但是,考虑到以下表达式,我会得到不同的结果:

FunctionExpand@Abs'[0]
(* Abs'[0] *)

Abs'[0] // FunctionExpand
(* 0 *)
Run Code Online (Sandbox Code Playgroud)

我不太确定为什么会这样.在几十个其他的代码片断的我有,f@expr,expr // f,和f[expr]所有的评价相同的结果.为什么这一个特定情况会给出这个结果?

acl*_*acl 10

这是一个优先问题.@的优先级高于//.要查看发生了什么,请将光标置于FunctionExpand两种情况下,然后再使用cmd +.(在OS X上)或ctrl +.在其他任何事情上,你最终都会按优先顺序选择事物.

另一种看待它的方法是使用Trace:

FunctionExpand@Abs'[0] // Trace
(*
-> {{{FunctionExpand[Abs],Abs},Abs^\[Prime]},(Abs^\[Prime])[0]}
*)
Run Code Online (Sandbox Code Playgroud)

Abs'[0] // FunctionExpand//Trace
(*
-> {FunctionExpand[(Abs^\[Prime])[0]],0}
*)
Run Code Online (Sandbox Code Playgroud)

特别注意,在第一种情况下,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]]]
*)
Run Code Online (Sandbox Code Playgroud)

这是一个更好的证明正在发生的事情.