rco*_*yer 12
简单来说,您修改后的问题很简单
f @@ {a,b,c,...} == f[a,b,c,...]
Run Code Online (Sandbox Code Playgroud)
哪里@@是简写Apply.在内部,{a,b,c}就是List[a,b,c](你可以通过看FullForm任何表达式),Apply只是取代了Head,List与一个新的Head,f,改变功能.通常,操作Apply不限于列表
f @@ g[a,b] == f[a,b]
Run Code Online (Sandbox Code Playgroud)
另外,看看Sequence哪个
f[Sequence[a,b]] == f[a,b]
Run Code Online (Sandbox Code Playgroud)
所以,我们可以这样做
f[ Sequence @@ {a,b}] == f[a,b]
Run Code Online (Sandbox Code Playgroud)
虽然迂腐似乎非常有用.
编辑:Apply有一个可选的第二个参数,指定一个级别,即
Apply[f, {{a,b},{c,d}}, {1}] == {f[a,b], f[c,d]}
Run Code Online (Sandbox Code Playgroud)
注意:正如这里所讨论的那样,简写Apply[fcn, expr,{1}]是指定您需要使用完整函数表单的任何其他级别描述.@@@
例如,对于两个元素
f[l_List]:=l[[1]]^2+l[[2]]^2
Run Code Online (Sandbox Code Playgroud)
对于任意数量的元素
g[l_List] := l.l
Run Code Online (Sandbox Code Playgroud)
或者
h[l_List]:= Norm[l]^2
Run Code Online (Sandbox Code Playgroud)
所以:
Print[{f[{a, b}], g[{a, b}], h[{a, b}]}]
{a^2 + b^2, a^2 + b^2, Abs[a]^2 + Abs[b]^2}
Run Code Online (Sandbox Code Playgroud)
还有两个,只是为了好玩:
i[l_List] := Total@Table[j^2, {j, l}]
j[l_List] := SquaredEuclideanDistance[l, ConstantArray[0, Length[l]]
Run Code Online (Sandbox Code Playgroud)
编辑
关于你的定义
f[{__}] = a ^ 2 + b ^ 2;
Run Code Online (Sandbox Code Playgroud)
它有几个问题:
1)您正在定义一个常量,因为它们a,b不是参数。
2) 您正在使用 Set 而不是 SetDelayed 定义函数,因此评估会立即完成。举个例子试试
s[l_List] = Total[l]
Run Code Online (Sandbox Code Playgroud)
与正确的方法相比:
s[l_List] := Total[l]
Run Code Online (Sandbox Code Playgroud)
在您使用它之前,它保持未评估状态。
3)您使用的模式没有名称{__},因此您不能在表达式的右侧使用它。正确的方法可能是:
f[{a_,b_}]:= a^2+b^2;
Run Code Online (Sandbox Code Playgroud)