2009-09-11 70 views
51

它似乎是一些類型的等價比較,但不是字符串。確實!=在OCaml中有意義嗎?

# 3 != 3;; 
- : bool = false 
# 3 != 2;; 
- : bool = true 

這是預期的。

# "odp" = "odp";; 
- : bool = true 
# "odp" != "odp";; 
- : bool = true 
# "odp" <> "odp";; 
- : bool = false 

爲什麼"odp" != "odp"評估爲true?它究竟在做什麼?它不應該產生類型錯誤?

回答

76

你已經經歷了結構和物理平等之間的差異。

<>=(結構相等)作爲!===(物理平等)

"odg" = "odg" (* true *) 
"odg" == "odg" (* false *) 

是假的,因爲每一個在不同的存儲位置實例化,這樣做的:

let v = "odg" 
v == v (* true *) 
v = v (* true *) 

大部分您要使用的時間爲=<>

編輯時左右結構和物理平等是等價

您可以使用what_is_it function,並找出這將是等於在結構上和身體上的所有類型。正如下面的評論和鏈接文章中提到的,字符,整數,單位,空列表以及變體類型的一些實例都具有此屬性。

+1

+1你是最快的... :) – LB40 2009-09-11 19:10:28

14

!=運算符相反的是==運算符,而不是=之一。

# "a" != "a" ;; 
- : bool = true 
# "a" == "a" ;; 
- : bool = false 

==運算符是一個「物理相等」。當你鍵入"a" == "a"時,你比較兩個不同的實例碰巧看起來很像的字符串,所以操作符返回false。雖然有一個實例使得它返回true:

# let str = "a" 
    in str == str ;; 
- : bool = true 
# let str = "a" 
    in str != str ;; 
- : bool = false 
0

整數身在何處物理和結構平等是相同的唯一類型,因爲整數是是拆箱

+1

整數和字符是唯一的類型...... FTFY – nlucaroni 2009-09-11 19:07:28

+1

布爾也... – LB40 2009-09-11 19:12:45

+1

爲了縮短這個名單了,它確實應該說任何整數像,因爲它還包括空列表和單位 – nlucaroni 2009-09-12 02:46:41

12

==!=快速解釋的唯一類型在OCaml中,除了已經提供的所有正確答案外:

1/==!=公開您實際上不想知道的實現細節。例如:

# let x = Some [] ;; 
val x : 'a list option = Some [] 
# let t = Array.create 1 x ;; 
val t : '_a list option array = [|Some []|] 
# x == t.(0) ;; 
- : bool = true 

到目前爲止,那麼好:xt.(0)在物理上是相同的,因爲t.(0)包含一個指向相同的塊x指向。這是實施的基本知識所要求的。但是:

# let x = 1.125 ;; 
val x : float = 1.125 
# let t = Array.create 1 x ;; 
val t : float array = [|1.125|] 
# x == t.(0) ;; 
- : bool = false 

你在這裏看到的是一個涉及浮點數的有用優化結果。

2 /另一方面,有一種安全的方式來使用==,這是一個快速但不完整的方法來檢查結構的平等。

如果在二叉樹

let equal t1 t2 = 
    match ... 

檢查t1t2物理平等寫一個平等的功能是一個快速的方法來檢測他們顯然結構相同,甚至無需遞歸和閱讀。那就是:

let equal t1 t2 = 
    if t1 == t2 
    then true 
    else 
    match ... 

如果你記住,OCaml中的「布爾或」運算符是「懶」,

let equal t1 t1 = 
    (t1 == t2) || 
    match ... 
2

他們就像在你的類中的兩個「湯姆」 S!因爲:

在這種情況下,"odp" = "odp" 因爲他們兩個字符串與SAME VALUE!

因此,他們並不==,因爲他們是兩個不同串店不同(存儲器)位置

他們=因爲他們有相同的字符串值

更深一步,「odp」是匿名變量。和兩個匿名變量導致這個兩個字符串。

爲了您的方便:

# "odp" = "odp";; 
- : bool = true 
# "odp" != "odp";; 
- : bool = true 
# "odp" <> "odp";; 
- : bool = false 
相關問題