Mik*_*ley 5 wolfram-mathematica
我被玩弄的Prefix和Postfix运营商(@和//分别),我遇到了以下问题.
鉴于以下代码,他们以相同的方式进行评估:
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)
这是一个更好的证明正在发生的事情.