2012-02-18 187 views
3

我定義了兩個對象:數學沒有評估#1

f=x^2 
g=x->#1 

爲什麼會這樣:

f /. x -> #1 &[5] 

給我預期的結果:

25 

但這:

f /. g &[5] 

給我:

#1^2 

彷彿#1,沒有被評估爲5 請幫助。

+3

與Mathematica一樣,在Trace []中包裝你的表達式並檢查輸出在這裏很有指導意義。 – 2012-02-18 21:46:47

+0

謝謝。但是,我如何修改聲明,讓我得到錯誤的結果,按預期工作?我真的是Mathematica的初學者,所以我不知道大多數事情。 – user1161552 2012-02-18 22:26:35

回答

2

您可以通過保持純功能組件一起工作。

f = x^2 
g = x -> #1 & 

f/. g[5] 

要通過列表運行形成映射之前的功能。

f = x^2 
g = x -> #1 
list = {1, 2, 3, 4, 5}; 
b = Block[{a}, Function[f /. a] /. a -> g] 
Map[b, list] 

{1,4,9,16,25}

而對於評價的具體問題...

vars = {x, y}; 
f = x + y; 
g = Table[vars[[i]] -> Slot[i], {i, 1, Length[vars]}]; 
b = Block[{a}, Function[f /. a] /. a -> g]; 
list = {{1, 2}, {3, 4}, {5, 6}}; 
Map[b[Sequence @@ #] &, list] 

{3,7,11}

與嚮導先生的回答,這可以成爲:

vars = {x, y}; 
f = x + y; 
g = Table[vars[[i]] -> Slot[i], {i, 1, Length[vars]}]; 
list = {{1, 2}, {3, 4}, {5, 6}}; 
Map[Evaluate[f /. g] &[Sequence @@ #] &, list] 

{3,7,11}

+0

好的,問題是:地圖[f /。 {x - >#1}&,list] – user1161552 2012-02-18 23:00:36

+0

好的,問題是,我想要做這樣的事情:vars = {x,y}; F = X + Y; g =表[vars [[i]] - >槽[i],{i,1,長度[vars]}];列表= {{1,2},{3,4},{5,6}};地圖[f /。g&,list];並得到{5,7,11}這是因爲f會從用戶的一些表達式和變量列表,所以我不能硬編碼變量。 – user1161552 2012-02-18 23:06:56

+0

太好了,謝謝。有一件事我不明白:你發送一個序列到塊b。所以序列被理解爲該塊的參數列表? – user1161552 2012-02-19 00:13:03

2

Function(短形式&)具有屬性HoldAll

Attributes[Function] 
{HoldAll, Protected} 

因此g保持未計算的。你可以用Evaluate迫使它:

Evaluate[f /. g] &[5] 
25 

Evaluate不會在表達更深層次的工作;你不能寫出f /. Evaluate[g] &

+0

有趣 - 我沒有嘗試在評估中包裝更完整的表達式。 – 2012-02-19 10:37:28