如何突破Function的HoldAll属性来强制评估body元素?


8

这个问题涉及创建一个函数。让我们考虑下面的代码

With[{f = Function[t, Cos[t]]}, 
{First[#], f'[#]} & 
] 

返回

(* ==> {First[#1], Function[t, Cos[t]]'[#1]} & *) 

我如何可以强制返回评估的导数(仅返回列表的第二部分);即,如何能我得到

(* ==> {First[#1], -Sin[#1]} & *) 
  0

正如halirutan所说的,你想要建立一个已经评估过的部分函数。不是所有的,或者“First @#”都会被评估,你不想要。所以,你想要注入代码到一个表达式中。在网站中搜索。 24 8月. 132013-08-24 18:24:25

0
With[{f = Function[t, Cos[t]]}, {First[#] &, f'[#] &}][[2]] 

把&括号内为每个函数。

  0

谢谢,但这并不完全是我的意思。 24 8月. 132013-08-24 15:51:38


8

Function,在你的情况下,你正在使用的句法糖,#,持有它的论点。因此,您的表达式不会被评估。有几种方法可以做到这一点,我相信他们已经在这里讨论过了,但现在我找不到问题了。总之,一个方法是使用替代

With[{f = Function[t, Cos[t]]}, 
Block[{expr}, 
    {First[#], expr} & /. expr -> f'[#] 
    ] 
] 

另一种是用另一个纯函数

With[{f = Function[t, Cos[t]]}, 
Function[expr, {First[#], expr} &][f'[#]]] 

此外,this Q&A讨论这个问题也和给出的答案更thourough解释。

  0

如何命名形式参数而不是'#'(在函数构造之前有可能重命名)? 24 8月. 132013-08-24 22:16:13


4
With[{f = Function[t, Cos[t]]}, 
    Evaluate[{First[k], f'[k]}] & /. k :> # // Quiet 
] 

With[{f = Function[t, Cos[t]]}, 
    With[{k = f'[#]}, {[email protected]#, k} &] 
]