Я действительно плохо пишу после Саймона и Даниэля, но их коды не работают на не-функциях, которые не являются символами. Проверяя это и добавляя проверку на встроенные через 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}
Если вы знаете сигнатуру функции, которую вы ищете (то есть, сколько аргументов и какого типа), я бы согласился с Саймоном в том, что нужно выбрать утку: 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}