質問
文字列ではなく、一部の型の同値比較のようです。
# 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true
これは予想どおりです。
# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
なぜ"odp" != "odp"
はtrue
と評価されるのですか?実際に何をしていますか?型エラーを生成すべきではありませんか?
解決
構造的および物理的平等の違いを経験しました。
<>
は=
(構造的同等性)であり、!=
は==
(物理的同等性)である
"odg" = "odg" (* true *)
"odg" == "odg" (* false *)
はfalseです。それぞれが異なるメモリ位置にインスタンス化されているためです:
let v = "odg"
v == v (* true *)
v = v (* true *)
ほとんどの場合、<=>および<=>を使用します。
構造的および物理的平等がいつ同等になるかを編集する:
what_is_it関数を使用して、すべての構造的および物理的に等しい型。以下のコメントおよびリンクされた記事で述べたように、文字、整数、単位、空のリスト、およびバリアント型の一部のインスタンスにはこのプロパティがあります。
他のヒント
!=
演算子の反対は==
演算子ではなく、=
演算子です。
# "a" != "a" ;;
- : bool = true
# "a" == "a" ;;
- : bool = false
==演算子は<!> quot; physical equality <!> quot;です。 "a" == "a"
と入力すると、似ているように見える文字列の2つの異なるインスタンスを比較するため、演算子はfalse
を返します。 1つのインスタンスがある間、trueを返します:
# let str = "a"
in str == str ;;
- : bool = true
# let str = "a"
in str != str ;;
- : bool = false
OCamlの==
および!=
に関する簡単な説明と、すでに提供されているすべての正しい答え:
1 / x
およびt.(0)
は、本当に知りたくない実装の詳細を公開します。例:
# 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
これまでのところ非常に良い:t1
とt2
は物理的に等しい。<=>には<=>が指しているのと同じブロックへのポインターが含まれているからだ。これは、実装の基本的な知識が指示するものです。しかし:
# 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 ...
<=>と<=>の物理的な同等性をチェックすると、それらを再帰的に読み取ったり読み取ったりすることなく、明らかに構造的に同等であることを簡単に検出できます。つまり:
let equal t1 t2 =
if t1 == t2
then true
else
match ...
OCamlでは、<!>#8220; booleanまたは<!>#8221;演算子は<!>#8220; lazy <!>#8221;、
let equal t1 t1 =
(t1 == t2) ||
match ...
クラス内の2つの<!> quot; Tom <!> quot;のようなものです!理由:
この場合、"odp" = "odp"
それらは SAME VALUE !!
これらは Two であるため==
ではありません。異なる(メモリ)場所
同一の文字列値を持つため、=
です。
もう一段深く、<!> quot; odp <!> quot;匿名変数です。そして、2つの匿名変数がこの 2つの文字列につながります。
便宜上:
# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
intsは、物理的および構造的同等性が同じである唯一のタイプです。これは、intがボックス化されていない唯一のタイプであるためです