2011-06-28 9 views
12

Jaki jest najlepszy/najczystszy/zalecany sposób sprawdzenia, czy wartość ma wartość Null w programie Mathematica? A nie Null?Testowanie wartości zerowej i niezerowej w Mathematica

Na przykład

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

ma wyniki:

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

Jeżeli by się było spodziewać, że 2 do F [B].

+13

Użyj SameQ (===) zamiast równości w teście predykatów. –

+0

To prawda! Równy To samo. Muszę sprawdzić, dlaczego istnieje różnica. –

+4

Zajmuję się tym tematem: http://www.mathprogramming-intro.org/book/node24.html –

Odpowiedz

12

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} 
6

Inną możliwością jest, aby mieć dwa DownValues, jeden dla warunku specjalnego null i normalne definicji. Ma to tę zaletę, że nie musisz się martwić o Null w drugim.

f[Null] := 1 

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