2011-02-01 55 views
3

我在想如何編寫一個函數用於Mathematica中的Apply函數?例如,我想平凡重新實現Or功能,我發現下面我應該如何編寫一個在Mathematica中應用的函數?

Apply[(#1 || #2)&,{a,b,c}] 

是不行的,因爲它只Or「編在列表中的前兩個元素。非常感謝!

+1

看着你的個人資料我看到你投票只有兩次在問題和答案。那是因爲你對堆棧溢出中看到的答案感到失望,或者僅僅是因爲你忘記了投票? – 2011-02-01 19:52:02

+0

@belisarius:哦,我的壞。我認爲接受一個答案就夠了。讓我這樣做,並在將來記住這一點。 :) – 2011-02-01 19:59:20

回答

11

這將工作,無論多少VARS,並且是一般模式:

Or[##]&, 

例如

In[5]:= Or[##] & @@ {a, b, c} 

Out[5]= a || b || c 

然而,在的情況下,這是不夠的,因爲OrHoldAll和短路 - 也就是說,它停止在第一個True聲明,並保持其餘未評估。例如:

In[6]:= Or[True, Print["*"]] 

Out[6]= True 

In[7]:= Or[##] & @@ Hold[True, Print["*"]] 

During evaluation of In[7]:= * 

Out[7]= True 

這將是好的,但:

Function[Null,Or[##],HoldAll], 

例如,

In[8]:= Function[Null, Or[##], HoldAll] @@ Hold[True, Print["*"]] 

Out[8]= True 

,可以在這樣的情況下才能使用(當你不希望你的論點,以評估)。請注意,這使用Function的無證書形式。這種形式的提及可以在R.Maeder的書中「Mathematica編程」中找到。

HTH

4
Or @@ {a, b, c}  

等效

Apply[Or, {a, b, c}] 

等效

{a, b, c} /. {x_, y__} -> Or[x, y] 

應用這樣的作品:

{2 #1, 3 #2, 4 #3} & @@ {a, b, c} 
{2 a, 3 b, 4 c} 

Plus[2 #1, 3 #2, 4 #3] & @@ {a, b, c} 
2 a + 3 b + 4 c 
0

你確定你是從應用期待正確的事情?如果您查看文檔http://reference.wolfram.com/mathematica/ref/Apply.html,您會看到Apply [f,expr]只是用expr替換f的頭部。它確實是而不是,一般來說給f [expr]。

如果您希望使用函數f操作expr,請嘗試f @ expr或f [expr]。

也許你理解了上面和你真正的問題是,「我怎麼定義了一些的f,當我做Apply[f,{a,b,c}],做同樣的工作作爲Or[a,b,c]。是這樣嗎?

相關問題