函数FunctionQ
的外观如何,或许我甚至可以指定允许的参数数量?
答案 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_]
等问题而失败......它应该也可以测试UpValues
,SubValues
和NValues
(请参阅here的含义) 。
此问题已在此thread中讨论过。这个主题中有许多有用的想法 - 例如找到某些函数可以采用的参数数量的方法,但是在讨论中没有达成真正的共识。
我认为最好的方法是duck typing。您可能知道您希望函数采用多少以及哪种类型的参数,因此请使用ValueQ进行测试。然后确保使用Check捕获错误。
编辑: 另一个comp.soft-sys.math.mathematica thread。
答案 2 :(得分:2)
这里有一些快速而肮脏的东西可以做你需要的东西:
FunctionQ[x_] := Head[x] == Function || DownValues[x] =!= {}