2011-07-15 34 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

謝謝,這完全回答了我的問題。 –