Jan*_*nus 11
在西蒙和丹尼尔之后,我真的感觉很糟糕,但是他们的代码在非功能上失败了.检查并检查内置通过NumericFunction
,如西蒙所建议,我们得到类似的东西
FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True;
FunctionQ[f_Symbol] := Or[
DownValues[f] =!= {},
MemberQ[ Attributes[f], NumericFunction ]]
FunctionQ[_] = False;
Run Code Online (Sandbox Code Playgroud)
这应该适用于某些(叹气)现实世界的案例
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}
Run Code Online (Sandbox Code Playgroud)
如果你知道你正在寻找的函数的签名(即有多少参数和类型),我同意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}
Run Code Online (Sandbox Code Playgroud)