2011-07-15 16 views
5

Prefix ve Postfix işleçleriyle (sırasıyla @ ve //) oynuyordum ve aşağıdaki soruna rastladım.Mathematica'da f @ expr ve expr // f kullanarak farklı sonuçlar

Aşağıdaki kod, aynı kesin bir şekilde değerlendirmek Verilen: Ben gerçekten çok emin değilim

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

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

:

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

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

Ancak şu ifadelere yer verildi, ben farklı sonuçlar elde neden bu. Sahip olduğum diğer kod parçacıkları içinde, [email protected], expr // f ve f[expr] hepsi aynı sonucu değerlendirir. Bu özel durum neden bu sonucu veriyor?

+2

Bu bağlantı muhtemelen alakalı olabilir: http://www.mathprogramming-intro.org/book/node174.html, benzer öncelikli konuları tartıştığım yer. Orijinal ifadede 'FullForm' kullanılması genellikle yardımcı olur. –

+0

@Leonid 'FullForm', önerdiğimden daha fazlasını görmek için daha iyi bir yoldur; Bunu cevabıma ekledim, umarım sakıncası yok – acl

+0

@acl Harika! Dışarı çıkarken cevabı yazıyordum, o yüzden benimkini aldım, senin için oy verdim ve bağlantıyı bıraktım. Her iki yaklaşımın da listelenmesi iyidir. –

cevap

10

Bu bir öncelikli sorun. @, // 'den daha yüksek önceliğe sahiptir. Neler olup bittiğini görmek için, imleci her iki durumda FunctionExpand'a yerleştirin, sonra cmd +. (OS X'de) veya ctrl +. başka bir şey üzerinde, ve önceliğe göre şeyleri seçmeye son verirsin.

bir başka yolu da Trace kullanmaktır görmek için: İlk vaka MMA ilk sonra, Abs elde devam FunctionExpand[Abs] değerlendirir nasıl

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

Özellikle

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

ederken, dikkat edin. Bu tam olarak @'un // ile karşılaştırıldığında ne kadar güçlü bağlandığından kaynaklanmaktadır.

DÜZENLEME: Leonid'in comment @ esinlenmiş bu da bilgilendirici: ne olup bittiğini çok daha iyi tanıtımdır

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

.

+0

Teşekkürler, bu soruyu mükemmel bir şekilde yanıtlıyor . –