Jak zauważył Daniel (i wyjaśnione w książce Leonid za) Null == 0
nie oceniać albo True
lub False
, więc stwierdzenie If
(jak napisano) także nie ocenia. Null
jest specjalnym Symbol
, który nie wyświetla się na wyjściu, ale na wszystkie inne sposoby działa jak normalny, codzienny symbol.
In[1]:= Head[Null]
Out[1]= Symbol
jakiegoś nieokreślonego symbolem x
, nie chcesz x == 0
wrócić False
, ponieważ x
mogłaby wynosić zero później. Dlatego też Null == 0
również nie ocenia.
Istnieją dwa możliwe poprawki do tego:
1) Siła testy do oceny korzystania TrueQ
lub SameQ
.
Dla testu n == Null
poniższe będą równoważne, ale podczas testowania obiektów numerycznych nie będą. (To dlatego Equal
wykorzystuje przybliżoną test równoważności numerycznej.)
f[n_] := If[TrueQ[n == Null], 1, 2] (* TrueQ *)
f[n_] := If[n === Null, 1, 2] (* SameQ *)
Korzystanie z powyższym, instrukcja warunkowa działa jak chciałeś:
In[3]:= {f[Null], f[0]}
Out[3]= {1, 2}
2) użyć opcjonalnego 4-ci argument If
który jest zwracany, jeśli próba pozostaje unevaluated (czyli jeśli nie jest to ani True
ani False
)
g[n_] := If[n == Null, 1, 2, 3]
Następnie
In[5]:= {g[Null], g[0]}
Out[5]= {1, 3}
Użyj SameQ (===) zamiast równości w teście predykatów. –
To prawda! Równy To samo. Muszę sprawdzić, dlaczego istnieje różnica. –
Zajmuję się tym tematem: http://www.mathprogramming-intro.org/book/node24.html –