Ответ 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}