Function mathematica中是否有可用于定义输入类型的函数头?

Function mathematica中是否有可用于定义输入类型的函数头?,function,types,operators,wolfram-mathematica,functional-programming,Function,Types,Operators,Wolfram Mathematica,Functional Programming,我正在定义一个将函数作为输入的函数,我想在输入类型中指定它,即运算符[?FunctionQ]:=。。。 但是到目前为止,在mathematica中还没有函数Q。除了不指定任何类型之外,我如何解决这个问题呢 有什么想法吗 哦!! 这: 也许这就是我想要的答案。我正在进一步阅读 提出的解决方案是否可靠?即: FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True; FunctionQ[f_Symbol] :=

我正在定义一个将函数作为输入的函数,我想在输入类型中指定它,即运算符[?FunctionQ]:=。。。 但是到目前为止,在mathematica中还没有函数Q。除了不指定任何类型之外,我如何解决这个问题呢

有什么想法吗

哦!! 这: 也许这就是我想要的答案。我正在进一步阅读

提出的解决方案是否可靠?即:

FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True;
FunctionQ[f_Symbol] := Or[
  DownValues[f] =!= {}, 
  MemberQ[ Attributes[f], NumericFunction ]]
FunctionQ[_] = False;

所展示的定义具有很大的实用性。问题是:在Mathematica中,函数究竟是由什么构成的?纯函数等很容易归类为函数,但涉及模式匹配的定义又如何呢?考虑:

h[g[x_]] ^:= x + 1
h
是否被视为一项功能?如果是这样的话,将很难确定,因为这将需要检查系统中每个符号的向上值来做出确定。
g
是函数吗?它有一个向上的值,但
g[x]
是一个惰性表达式

头部结构如何:

f[x_][y_][z_] := x + y + z
f
是函数吗?那么
f[1]
或者
f[1][2]

还有各种功能,如JLink和NETLink:

obj@toString
a函数

我不想在不提供解决方案的情况下提出这些问题,但我想强调的是,在Mathematica上下文中,什么构成函数是一个棘手的问题。从理论和实践的角度来看,这都很棘手


我认为所展示的函数测试是否完整的答案实际上取决于您将在特定应用程序中提供的表达式类型。

可能重复@Mr.Wizard:我只想确保提出的解决方案是健壮的。当我发现一个表达式是否是函数时,我想删除这个问题,但我仍然可以这样做。。。。特别是,| u函数| | | | | | | | | | |编译函数是否涵盖了所有内容?Phil,我不是要“惩罚”你。我只是认为,如果把这两个问题结合起来,社会会得到更好的服务。我建议不要创建一个你打算在一段时间内删除的问题;几天前我试过了,结果不太好。:-@Wizard先生,在提出一个单独的问题时,我希望讨论什么是函数测试的健壮性,这种测试的计算效率如何,测试本身以及它如何影响以函数作为输入的函数的计算速度。我觉得这将是一个单独的重点,以保证一个不同的问题@花环的回答就是这个方向。如何在不删除提供的答案的情况下组合问题?谢天谢地,我不反对这种推理。在这一点上,我相信版主必须进行合并。@花环:这是一个很好的(!)非答案,因为它比我在这里描述的潜在陷阱更好。我不知道是否保留未定义的类型是不安全的,但我不知道它如何影响计算速度……我指出了许多我认为是不是头函数>函数>代码>的函数(或者甚至<代码>符号< /代码>)。我将给出相同的建议,我总是给别人:不要尝试对函数进行类型检查。如果您正在编写可以将函数作为参数的内容,请将任何其他未知输入视为函数,并检查结果的正确性,而不是尝试预先检查输入。(通常我第一次就被忽略了,但他们最终还是学会了。)Brett,这就是我的想法,但我想要的是高效计算的东西,我想最终编译函数。我支持@Brett-一般来说,尝试键入检查函数在我看来就像与(未键入的)Mathematica语言斗争一样,与语言斗争很少有回报。在mma中,还有其他一些情况下,键入可能是有益的(例如,实现抽象数据类型),但显然不是这样。而且,正如@Florach所展示的,这甚至很难很好地定义,更不用说变得健壮了。以下是一个相关MathGroup讨论的链接:
Needs["JLink`"]
obj = JavaNew["java.util.Date"]
obj@toString[]