Wolfram mathematica 测试表达式是否为函数?

Wolfram mathematica 测试表达式是否为函数?,wolfram-mathematica,Wolfram Mathematica,函数FunctionQ看起来如何,也许在某种程度上我甚至可以指定允许的参数数量?下面是一些快速而肮脏的东西,可以满足您的需要: FunctionQ[x_] := Head[x] == Function || DownValues[x] =!= {} 正如丹尼尔所说,他的测试(可能应该读) 它又快又脏。对于内置函数,它将失败,例如,FunctionQ[Sin]将返回False(通过检查属性数值函数),将捕获许多内置函数)。它也会失败,比如f[x_uu][y\uu]等。。。它可能还应该测试UpVa

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

下面是一些快速而肮脏的东西,可以满足您的需要:

FunctionQ[x_] := Head[x] == Function || DownValues[x] =!= {}
正如丹尼尔所说,他的测试(可能应该读)

它又快又脏。对于内置函数,它将失败,例如,
FunctionQ[Sin]
将返回False(通过检查
属性
数值函数
),将捕获许多内置函数)。它也会失败,比如
f[x_uu][y\uu]
等。。。它可能还应该测试
UpValues
子值
,也可能测试
NValues
(有关其含义,请参阅)

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

我认为最好的方法是一种。您可能知道希望函数接受多少个参数以及参数的类型,所以请使用进行测试。然后确保使用捕获错误

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

在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的观点,即方法是使用duck键入:
将函数应用于典型参数,并查找有效输出。缓存可能值得:

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} 

我不太明白你的问题。您的意思是要编写一个函数FunctionQ[input_u3;],如果输入是函数,它将返回True,否则返回false?输入采用什么形式?@Mark:我的第一个问题是肯定的。输入的形式是一个Mathematica表达式…绝对不要感觉糟糕!这就是莫言:彼此依靠,找出最好的答案。顺便说一句,这方面做得很好!我刚刚又看了一遍,注意到
AlternativeFunctionQ
没有发现
FunctionQ
是一个1var函数。因此,虽然它能有效地查找数值函数,但却找不到其他类型。@rcollyer:The
AlternativeFunctionQ
就是一个例子:典型的参数和有效的输出应该适应当前的情况。我想从架构的角度来看,这不是很优雅,但它通常非常符合要求。我喜欢我如何能够在这样的环境中蹦蹦跳跳,继续找到新的有趣的答案+1.为此干杯。
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}