web-dev-qa-db-ja.com

!=はOCamlで意味がありますか?

一部のタイプでは同等の比較のようですが、文字列ではありません。

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

これは予想通りです。

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

どして "odp" != "odp"trueと評価されますか?それは実際に何をしていますか?型エラーを生成してはいけませんか?

61
Nick Heiner

あなたは構造的平等と物理的平等の違いを経験しました。

<>=(構造的等式)として!===(物理的同等性)

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

それぞれが異なるメモリロケーションにインスタンス化されるため、falseになります。

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

ほとんどの場合、=および<>

構造的および物理的同等性が同等である場合について編集します

what_is_it関数 を使用して、構造的にも物理的にも等しいすべてのタイプを見つけることができます。以下のコメントとリンクされた記事で述べられているように、文字、整数、単位、空のリスト、およびバリアント型のいくつかのインスタンスがこのプロパティを持ちます。

91
nlucaroni

!=演算子の反対は==演算子であり、=演算子ではありません。

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

==演算子は「物理的等価」です。 "a" == "a"を入力すると、たまたま似た文字列の2つの異なるインスタンスを比較するため、演算子はfalseを返します。 1つのインスタンスがあると、trueが返されます。

# let str = "a"
  in str == str ;;
- : bool = true
# let str = "a"
  in str != str ;;
- : bool = false
16
P Shved

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 ...
_

_t1_および_t2_の物理的等価性をチェックすることは、再帰的に読み取らなくても、それらが明らかに構造的に等しいことを検出する迅速な方法です。あれは:

_let equal t1 t2 =
  if t1 == t2
  then true
  else 
    match ...
_

そして、OCamlでは「ブールOR」演算子は「遅延」であることを覚えておいてください。

_let equal t1 t1 =
  (t1 == t2) ||
  match ...
_
12
Pascal Cuoq

それらはクラスの2つの「トム」のようなものです。なぜなら:

この場合、"odp" = "odp"[〜#〜] two [〜#〜][〜#〜] same [〜#〜]の文字列であるため値!!

[〜#〜] two [〜#〜]異なる文字列がdifferent(メモリ)locationに格納されているため、==ではありません

同一の文字列値があるため、これらは=です。

もう1つ深く、「odp」は匿名変数です。そして、2つの匿名変数がこれを導きますTwo文字列。

あなたの便宜のために:

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

intsはボックス化されていない唯一のタイプであるため、物理的および構造的同等性が同じである唯一のタイプです。

0
newacct