测试表达式是否为函数?

Kar*_* W. 5 wolfram-mathematica

函数如何FunctionQ看起来,也许我甚至可以指定允许的参数数量?

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)