测试表达式是否为函数?

时间:2010-09-17 15:58:39

标签: wolfram-mathematica

函数FunctionQ的外观如何,或许我甚至可以指定允许的参数数量?

3 个答案:

答案 0 :(得分:11)

在西蒙和丹尼尔之后,我真的感觉很糟糕,但是他们的代码在非功能上失败了。根据Simon的建议,检查并通过NumericFunction添加内置检查,我们得到类似

的内容
FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True;
FunctionQ[f_Symbol] := Or[
  DownValues[f] =!= {}, 
  MemberQ[ Attributes[f], NumericFunction ]]
FunctionQ[_] = False;

哪些应该适用于某些(叹气)现实世界的案例

In[17]:= 
FunctionQ/@{Sin,Function[x,3x], Compile[x,3 x],Interpolation[Range[5]],FunctionQ,3x,"a string", 5}
Out[17]= {True,True,True,True,True,False,False,False}

如果你知道你正在寻找的函数的签名(即有多少参数和类型),我会同意Simon的说法,那就是鸭子打字:Apply典型参数的函数,并寻找有效的输出。缓存可能是值得的:

AlternativeFunctionQ[f_]:=AlternativeFunctionQ[f]=
  With[{TypicalArgs={1.0}},NumericQ[Apply[f,TypicalArgs]]];

In[33]= AlternativeFunctionQ/@{Sin,Function[x,3x], Compile[x, 3x],Interpolation[Range[5]],FunctionQ,3x,"a string", 5}
Out[34]= {True,True,True,True,False,False,False,False} 

答案 1 :(得分:3)

丹尼尔说,他的考试(可能应该阅读)

FunctionQ[x_] := Head[x] === Function || DownValues[x] =!= {}

快速又脏。内置函数会失败,例如FunctionQ[Sin]将返回False(检查Attribute NumericFunction会捕获许多内置函数)。它也会因f[x_][y_]等问题而失败......它应该也可以测试UpValuesSubValuesNValues(请参阅here的含义) 。

此问题已在此thread中讨论过。这个主题中有许多有用的想法 - 例如找到某些函数可以采用的参数数量的方法,但是在讨论中没有达成真正的共识。

我认为最好的方法是duck typing。您可能知道您希望函数采用多少以及哪种类型的参数,因此请使用ValueQ进行测试。然后确保使用Check捕获错误。

编辑: 另一个comp.soft-sys.math.mathematica thread

答案 2 :(得分:2)

这里有一些快速而肮脏的东西可以做你需要的东西:

FunctionQ[x_] := Head[x] == Function || DownValues[x] =!= {}