Mathematica中的函数类型声明

Phi*_*hil 3 types wolfram-mathematica function

我已经多次针对mathematica理解函数的输入数据声明类型遇到了这个问题.

似乎Mathematica理解以下类型声明:_Integer,_List,_?MatrixQ,_?VectorQ

但是:_Real,_Complex声明例如导致函数有时不计算.知道为什么吗?

这里的一般规则是什么?

acl*_*acl 10

当你做类似的事情时f[x_]:=Sin[x],你正在做的是定义一个模式替换规则.如果您改为说f[x_smth]:=5(如果您同时尝试两者,请Clear[f]在第二个示例之前执行),您实际上是在说"无论您在哪里,都要f[x]检查是否xsmth,如果是,则替换为5".比如试试吧

Clear[f]
f[x_smth]:=5
f[5]
f[smth[5]]
Run Code Online (Sandbox Code Playgroud)

所以,为了回答你的问题,规则是in f[x_hd]:=1;,hd可以是任何东西,并且与x的头部相匹配.

人们也可以有更复杂的定义,例如f[x_] := Sin[x] /; x > 12,如果x> 12,那么它们将匹配(当然这可以任意复杂化).

编辑:我忘记了Real部分.你当然可以定义Clear[f];f[x_Real]=Sin[x]它,例如f [12.].但你要记住,尽管Head[12.]Real,Head[12]Integer,让你的定义不匹配.


Sim*_*mon 6

只是一个快速的说明,因为没有人提到它.你可以模式匹配多个Heads - 这比使用?或的条件匹配更快/;.

f[x:(_Integer|_Real)] := True (* function definition goes here *)
Run Code Online (Sandbox Code Playgroud)

对于作用于Real或Integer参数的简单函数,它在大约75%的时间内作为类似的定义运行

g[x_] /; Element[x, Reals] := True (* function definition goes here *)
Run Code Online (Sandbox Code Playgroud)

(正如WReach指出的那样,75%的时间都
在运行 g[x_?(Element[#, Reals]&)] := True).

后一种形式的优点是它可以使用符号常量,例如Pi- 虽然如果你想要一个纯粹的数字函数,这可以用前者的形式修复N.

  • 匹配这样的多个头是非常脆弱的.忘记一种类型的表达式是很容易的,因为你在这里忘记了`Rational`,或者像`Sqrt [2]`(不仅仅是'Pi`).如果你需要检查表达式是否只是数字(而不是它是否有一个虚部),`x_?NumericQ`是最好的. (5认同)