我正在定义一个函数,它将一个函数作为输入,我想在输入类型中指定它,即Operat [_?FunctionQ]:= ... 但是在mathematica中还没有functionQ。除了没有指定任何类型之外,我该如何解决这个问题。
有什么想法吗?
哦! 这:Test if an expression is a Function? 可能是我正在寻找的答案。我正在进一步阅读
那里提出的解决方案是否健全?,即:
FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True;
FunctionQ[f_Symbol] := Or[
DownValues[f] =!= {},
MemberQ[ Attributes[f], NumericFunction ]]
FunctionQ[_] = False;
答案 0 :(得分:7)
展出的定义具有很大的实用性。问题是:Mathematica中的函数到底构成了什么?纯函数等很容易归类为函数,但涉及模式匹配的定义又如何呢?考虑:
h[g[x_]] ^:= x + 1
h
被视为功能吗?如果是这样,将难以识别,因为它将需要检查系统中每个符号的上升值以进行该确定。 g
是一个函数吗?它有一个up值,但g[x]
是一个惰性表达式。
头部构成怎么样:
f[x_][y_][z_] := x + y + z
f
是一个功能吗? f[1]
或f[1][2]
怎么样?
然后有各种功能,如 JLink 和 NETLink :
Needs["JLink`"]
obj = JavaNew["java.util.Date"]
obj@toString[]
obj@toString
是函数吗?
我讨厌在不提供解决方案的情况下提出这些问题 - 但我想强调的是,在Mathematica环境中构成函数的问题是一个棘手的问题。从理论和实践的角度来看都很棘手。
我认为展示的功能测试是否完整的答案实际上取决于您将在特定应用中提供它的表达类型。