67

文字列ではなく、一部の型の等価比較のようです。

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

これは予想通りです。

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

"odp" != "odp"が評価されるのはなぜtrueですか? それは実際に何をしているのですか?型エラーを生成するべきではありませんか?

4

5 に答える 5

101

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

<>is to =(構造的平等) as !=is to ==(物理的平等)

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

それぞれが異なるメモリ位置でインスタンス化されているため、false です。

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

=ほとんどの場合、 andを使用したいと思うでしょう<>

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

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

于 2009-09-11T18:54:19.603 に答える
2

彼らはあなたのクラスの 2 人の「トム」のようなものです! なぜなら:

この場合、同じ値を持つ2つの文字列で"odp" = "odp" あるためです。

したがって、異なる(メモリ)場所に格納されている2つの異なる文字列==あるため、そうではありません

それらは同一の文字列値=を持っているためです。

さらに深く、「odp」は無名変数です。そして、2 つの匿名変数がこのTwo文字列につながります。

あなたの便宜のために:

# "odp" = "odp";; 
- : bool = true 
# "odp" != "odp";; 
- : bool = true 
# "odp" <> "odp";; 
- : bool = false
于 2013-06-25T09:40:58.740 に答える
1

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

于 2009-09-11T19:06:12.027 に答える