代码之家  ›  专栏  ›  技术社区  ›  Karsten W.

测试表达式是否为函数?

  •  5
  • Karsten W.  · 技术社区  · 14 年前

    FunctionQ 你看,也许在某种程度上我甚至可以指定允许的参数数量?

    3 回复  |  直到 14 年前
        1
  •  12
  •   Janus    14 年前

    我真的很难过西蒙和丹尼尔后发布,但他们的代码失败的非功能,而不是符号。检查并通过 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的观点,即方法是duck键入: 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} 
    
        2
  •  4
  •   Simon    14 年前

    正如丹尼尔所说,他的测试(可能应该读)

    FunctionQ[x_] := Head[x] === Function || DownValues[x] =!= {}
    

    又快又脏。对于内置功能,例如。 FunctionQ[Sin] 将返回False(通过检查 Attribute NumericFunction ). 它也会失败,比如 f[x_][y_] UpValues , SubValues 也许吧 NValues here 它们的含义)。

    这篇文章讨论了这个问题 thread . 许多有用的想法都在这个线程-例如找到一些函数可以采取的参数数量的方法,但没有真正达成共识的讨论。

    我认为最好的办法是 duck typing . 您可能知道希望函数接受多少个参数以及参数的类型,所以请使用 ValueQ . 然后确保使用 Check .

    编辑: 另一个软补偿-系统数学数学 thread .

        3
  •  2
  •   dreeves    14 年前

    这里有一些快速而肮脏的东西可以满足你的需要:

    FunctionQ[x_] := Head[x] == Function || DownValues[x] =!= {}