在 Simon 和 Daniel 之后发帖我真的感觉很糟糕,但是他们的代码在非符号的非函数上失败了。根据 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}