在Mathematica中测试Null而不是Null

nil*_*ock 12 wolfram-mathematica

在Mathematica中测试值是否为Null的最佳/最干净/可取的方法是什么?而不是空的?

例如:

 a = Null
 b = 0;
 f[n_] := If[n == Null, 1, 2]
 f[a]
 f[b]
Run Code Online (Sandbox Code Playgroud)

得到的结果是:

 1
 If[0 == Null, 1, 2]
Run Code Online (Sandbox Code Playgroud)

我希望f [b]的2.

Sim*_*mon 12

正如丹尼尔指出(在狮子座的书解释)Null == 0不求值TrueFalse,所以If说明(书面),也没有评价. Null是一种特殊的Symbol,不会在输出中显示,但在所有其他方面,就像一个普通的日常符号.

In[1]:= Head[Null]
Out[1]= Symbol
Run Code Online (Sandbox Code Playgroud)

对于某些未定义的符号x,您不希望x == 0返回False,因为x稍后可能为零.这就是为什么Null == 0也不评估.

有两种可能的解决方法:

1)强制测试使用TrueQ或评估SameQ.
对于n == Null测试,以下将是等效的,但是在测试数字对象时,它们不会.(这是因为Equal对数值等价使用近似检验.)

f[n_] := If[TrueQ[n == Null], 1, 2]   (* TrueQ *)
f[n_] := If[n === Null, 1, 2]         (* SameQ *)
Run Code Online (Sandbox Code Playgroud)

使用上面的条件语句可以按照您的意愿工作:

In[3]:= {f[Null], f[0]}
Out[3]= {1, 2}
Run Code Online (Sandbox Code Playgroud)

2)If如果测试仍然没有评估(即如果它既不是True也没有False),则使用可选的第四个参数返回

g[n_] := If[n == Null, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

然后

In[5]:= {g[Null], g[0]}
Out[5]= {1, 3}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ell 6

另一种可能性是有两个DownValues,一个用于特殊条件Null,以及你的正常定义.这样做的好处是你不需要担心第二个Null.

f[Null] := 1

f[x_] := x^2 (* no weird Null^2 coming out of here! *)
Run Code Online (Sandbox Code Playgroud)