1

我在使用Which. 我正在 Mathematica 中创建一个函数,其中一个参数 ( arg2) 应该是Symbol(None或者Full)。我希望函数的输出像这样依赖arg2,但它不起作用:

testFunction[arg1_,arg2_:None]:=Which[arg2==None,arg1*2,arg2==Full,arg1*3]

if arg2isNone似乎没有问题,但是 for arg2is FulltestFunction只是返回自己。当使用实数或整数而不是符号NoneFull时,testFunction功能正常。

我在测试中使用符号是否犯了错误?Which或者在一起使用和符号时我应该注意其他任何“规则”吗?

我已经在这个网站和其他网站上搜索了答案,但找不到任何答案。Mathematica 帮助文件也没有为我提供答案。我看到的所有地方都没有使用女巫符号。

4

2 回答 2

5

解决方案是使用SameQ(即运算符===)而不是Equal(运算符==)。

Equal是为了数学平等。 a==b不计算,这意味着 Mathematica 不知道这些变量是否具有相同的值。 1==2评估为Falsea==a评估为True

SameQ是为了结构平等,并且总是评估为TrueFalseTrue仅当被比较的表达式在结构上相等时才会计算结果。它不会尝试测试数学相等性,因此 eg0 === 0.0会给出False,因为这两个表达式在结构上是不同的(一个是精确数字,另一个是机器精度)。

在这里,您需要结构上的平等,因为您需要Full === None评估False(同时Full == None保持未评估)。只需使用

testFunction[arg1_,arg2_:None]:=Which[arg2===None,arg1*2,arg2===Full,arg1*3]
于 2012-05-01T11:28:52.187 回答
1

虽然使用SameQ是一种解决方案,但我认为有更好的方法来构建它。 Switch是最直接的替换:

f[arg1_, arg2_: None] := Switch[arg2, None, arg1*2, Full, arg1*3]

f[7]
f[7, None]
f[7, Full]
14
14
21

通常最好避免使用Which/Switch等并使用模式,例如:

ClearAll[f]

f[arg1_, Full] := arg1*3
f[arg1_, None | PatternSequence[]] := arg1*2

f[7]
f[7, None]
f[7, Full]
14
14
21
于 2012-05-01T22:49:56.823 回答