我在想如何編寫一個函數用於Mathematica中的Apply
函數?例如,我想平凡重新實現Or
功能,我發現下面我應該如何編寫一個在Mathematica中應用的函數?
Apply[(#1 || #2)&,{a,b,c}]
是不行的,因爲它只Or
「編在列表中的前兩個元素。非常感謝!
我在想如何編寫一個函數用於Mathematica中的Apply
函數?例如,我想平凡重新實現Or
功能,我發現下面我應該如何編寫一個在Mathematica中應用的函數?
Apply[(#1 || #2)&,{a,b,c}]
是不行的,因爲它只Or
「編在列表中的前兩個元素。非常感謝!
這將工作,無論多少VARS,並且是一般模式:
Or[##]&,
例如
In[5]:= Or[##] & @@ {a, b, c}
Out[5]= a || b || c
然而,在的情況下,這是不夠的,因爲Or
是HoldAll
和短路 - 也就是說,它停止在第一個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
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
你確定你是從應用期待正確的事情?如果您查看文檔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]
。是這樣嗎?
看着你的個人資料我看到你投票只有兩次在問題和答案。那是因爲你對堆棧溢出中看到的答案感到失望,或者僅僅是因爲你忘記了投票? – 2011-02-01 19:52:02
@belisarius:哦,我的壞。我認爲接受一個答案就夠了。讓我這樣做,並在將來記住這一點。 :) – 2011-02-01 19:59:20