【问题标题】:Test if an expression is a Function?测试一个表达式是否是一个函数?
【发布时间】:2011-04-13 19:26:52
【问题描述】:

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

【问题讨论】:

  • 我不太明白你的问题。你的意思是你想写一个函数 FunctionQ[input_] 如果 input 是一个函数则返回 True ,否则返回 false ?输入采用什么形式?
  • @Mark:第一个问题我会回答是。输入的形式是 Mathematica 表达式...

标签: wolfram-mathematica


【解决方案1】:

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

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

又快又脏。内置功能将失败,例如FunctionQ[Sin] 将返回 False(许多内置函数将通过检查 Attribute NumericFunction 来捕获)。它也会因f[x_][y_] 等而失败......它可能还应该测试UpValuesSubValuesNValues(请参阅here 了解它们的含义)。

这个问题在thread 中讨论过。这个线程中有许多有用的想法——例如,找出某些函数可以采用的参数数量的方法,但在讨论中没有达成真正的共识。

我认为最好的方法是一种duck typing。您可能知道您希望函数采用多少参数和哪种类型的参数,因此请使用ValueQ 对其进行测试。然后确保使用Check 捕获错误。

编辑: 另一个 comp.soft-sys.math.mathematica thread

【讨论】:

    【解决方案2】:

    在 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} 
    

    【讨论】:

    • 绝对不要难过!这就是 SO 的 MO:相互补充以提出最佳答案。顺便说一句,这方面做得很好!
    • 我刚刚再看一遍,我注意到FunctionQ 不是AlternativeFunctionQ 发现的 1 var 函数。因此,虽然它在查找数值函数方面很有效,但它无法查找其他类型。
    • @rcollyer:AlternativeFunctionQ 是一个例子:典型的参数和有效的输出应该适应手头的情况。我想这从架构的角度来看不是很优雅,但它通常很符合要求。
    • 我喜欢我如何在 SO 中反弹并继续寻找新的有趣的答案。 +1 并为 SO 欢呼。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 2016-11-16
      • 2014-05-03
      • 2012-06-11
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多