2011-07-15 36 views
5

我当时玩的是PrefixPostfix运算符(分别为@//),我遇到了以下问题。在Mathematica中使用f @ expr和expr // f的不同结果

考虑下面的代码,他们评估完全相同的方式:

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

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

不过,考虑下面的表达式,我得到不同的结果:

[email protected]'[0] 
(* Abs'[0] *) 

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

我不太清楚真正为什么这是。在其他几十个代码片段中,[email protected],expr // ff[expr]都评估为相同的结果。为什么这一个特例会给出这个结果?

+2

此链接可能是相关的:http://www.mathprogramming-intro.org/book/node174.html,我在这里讨论类似的优先级相关问题。在原始表达式上使用'FullForm'通常会有所帮助。 –

+0

@Leonid'FullForm'是一个更好的方式来看看发生了什么比我建议的;我把这个添加到我的答案中,希望你不介意 – acl

+0

@acl太棒了!当你出来时,我正在使用它来输入答案,所以我放弃了我的,投了你的票,离开了链接。列出这两种方法是很好的。 –

回答

10

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

另一种方法是看它是使用Trace

[email protected]'[0] // Trace 
(* 
-> {{{FunctionExpand[Abs],Abs},Abs^\[Prime]},(Abs^\[Prime])[0]} 
*) 

Abs'[0] // FunctionExpand//Trace 
(* 
-> {FunctionExpand[(Abs^\[Prime])[0]],0} 
*) 

尤其注意如何在第一种情况下MMA第一评估FunctionExpand[Abs],获得Abs,然后继续。这正是由于@//相比有多强烈的结合。

编辑:由@狮子座的评论启发,这也是信息:

Hold[[email protected]'[0]] // FullForm 
Hold[Abs'[0] // FunctionExpand] // FullForm 
(* 
-> Hold[Derivative[1][FunctionExpand[Abs]][0]] 
    Hold[FunctionExpand[Derivative[1][Abs][0]]] 
*) 

这是正在发生的事情的一个更好的示范。

+0

谢谢,这完全回答了我的问题。 –