使用哪个与基于符号的测试

时间:2012-05-01 11:18:54

标签: wolfram-mathematica

使用Which时遇到问题。我在Mathematica中创建了一个函数,其中一个参数(arg2)应该是SymbolNoneFull)。 我希望函数的输出依赖于这样的arg2,但它不起作用:

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

如果arg2None似乎没有问题,但arg2FulltestFunction只会返回自己。 使用实数或整数而不是符号NoneFull时,testFunction可以正常运行。

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

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

2 个答案:

答案 0 :(得分:5)

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

Equal用于数学平等。 a==b没有评估,这意味着Mathematica不知道这些变量是否具有相同的值。当1==2评估为False时,a==a评估为True

SameQ用于结构平等,并始终评估为TrueFalse。如果被比较的表达式在结构上相等,它将仅评估为True。它不会尝试测试数学上的等式,例如0 === 0.0会给False,因为这两个表达式在结构上是不同的(一个是精确数字,另一个是机器精度数字)。

在这里,您需要结构相等,因为您需要Full === None来评估False(而Full == None保持未评估状态)。只需使用

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

答案 1 :(得分: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

通常最好避免使用哪种/开关等并使用模式,例如:

ClearAll[f]

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

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