2011-06-28 23 views
12

Cách tốt nhất/sạch nhất/được khuyến khích để kiểm tra nếu một giá trị là Null trong Mathematica là gì? Và không Null?Thử nghiệm cho Null và không Null trong Mathematica

Ví dụ:

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

có kết quả:

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

đâu tôi lại có thể ngờ rằng 2 cho f [b].

+13

Sử dụng SameQ (===) thay vì bằng kiểm tra dự đoán của bạn. –

+0

Điều đó xảy ra! Bằng nhau. Tôi phải kiểm tra tại sao có sự khác biệt. –

+4

Tôi đề cập đến chủ đề này tại đây: http://www.mathprogramming-intro.org/book/node24.html –

Trả lời

12

Như đã chỉ ra bởi Daniel (và được giải thích trong sách của Leonid) Null == 0 không đánh giá hoặc True hoặc False, do đó, tuyên bố If (như được viết) cũng không đánh giá. Null là một đặc biệt Symbol không hiển thị ở đầu ra, nhưng theo tất cả các cách khác hoạt động như biểu tượng bình thường, hàng ngày.

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

Đối với một số biểu tượng không xác định x, bạn không muốn x == 0 trở False, vì x có thể là zero sau này. Đây là lý do tại sao Null == 0 cũng không đánh giá.

Có hai bản vá có thể cho điều này:

1) quân sự thử nghiệm để đánh giá sử dụng TrueQ hoặc SameQ.
Đối với thử nghiệm n == Null, điều sau sẽ tương đương, nhưng khi kiểm tra các đối tượng số, chúng sẽ không. (Điều này là do Equal sử dụng một thử nghiệm gần đúng cho tương đương số.)

f[n_] := If[TrueQ[n == Null], 1, 2] (* TrueQ *) 
f[n_] := If[n === Null, 1, 2]   (* SameQ *) 

Sử dụng trên, báo cáo kết quả điều kiện làm việc như bạn muốn:

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

2) Sử dụng đối số thứ 4 tùy chọn của If được trả lại nếu thử nghiệm vẫn chưa được đánh giá (ví dụ: nếu nó không phải là True cũng không False)

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

Sau đó

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

Một khả năng khác là phải có hai DownValues, một cho tình trạng Null đặc biệt, và định nghĩa bình thường của bạn. Điều này có lợi thế là bạn không cần phải lo lắng về Null trong lần thứ hai.

f[Null] := 1 

f[x_] := x^2 (* no weird Null^2 coming out of here! *) 
Các vấn đề liên quan