Подтвердить что ты не робот

Тестирование для Null, а не Null в Mathematica

Каков наилучший/самый чистый/рекомендуемый способ проверить, является ли значение Null в Mathematica? И не Нуль?

Например:

 a = Null
 b = 0;
 f[n_] := If[n == Null, 1, 2]
 f[a]
 f[b]

имеет результат:

 1
 If[0 == Null, 1, 2]

Где бы я ожидал, что 2 для f [b].

4b9b3361

Ответ 1

Как указал Даниил (и объяснил в книге Леонида) Null == 0 не оценивает ни True, ни False, поэтому оператор If (как написано) также не оценивает. Null - это специальный Symbol, который не отображается на выходе, но всеми другими способами действует как обычный, повседневный символ.

In[1]:= Head[Null]
Out[1]= Symbol

Для некоторого символа undefined 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 *)

Используя вышеизложенное, условное выражение работает так, как вы хотели:

In[3]:= {f[Null], f[0]}
Out[3]= {1, 2}

2) Используйте необязательный 4-й аргумент If, который возвращается, если тест остается неоцененным (т.е. если он не является True и False)

g[n_] := If[n == Null, 1, 2, 3]

Тогда

In[5]:= {g[Null], g[0]}
Out[5]= {1, 3}

Ответ 2

Другая возможность состоит в том, чтобы иметь два DownValues, один для специального условия Null и ваше обычное определение. Это имеет то преимущество, что вам не нужно беспокоиться о Null во втором.

f[Null] := 1

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