web-dev-qa-db-fra.com

Quelle est la différence entre "égale (=)" et "identique (==)" dans OCAML?

Dans OCaml, nous avons deux types de equity comparisons:

x = y Et x == y,

Alors, quelle est exacte la différence entre eux?

Est-ce que x = y Dans OCAML comme x.equals(y) en Java?

et x == y Comme x == y (comparing the address) en Java?

27
Jackson Tale

Je ne sais pas exactement comment x.equals(y) fonctionne en Java. Si cela fait une comparaison "profonde", l'analogie est assez proche. Une chose à faire attention est que l'égalité physique est un concept glissant dans OCAML (et des langues fonctionnelles en général). Le système de compilateur et d'exécution va déplacer des valeurs autour et peut fusionner et défermer des valeurs pures (non mutables) à volonté. Donc, vous ne devriez utiliser que == Si vous savez vraiment ce que vous faites. À un certain niveau, cela nécessite une familiarité avec la mise en œuvre (qui est quelque chose à éviter à moins que nécessaire).

Les garanties spécifiques que OCAML fait == Sont faibles. Les valeurs mutables comparent comme étant physiquement égales dans la manière dont vous vous attendez (c'est-à-dire si la mutation de l'un des deux mauvoira également l'autre aussi). Mais pour des valeurs non mutables, la seule garantie est que les valeurs qui se comparent physiquement égales (==) comparera également comme égale (=). Notez que l'inverse est non true, car SEPP2K souligne les valeurs flottantes.

En substance, ce que la spécification de la langue vous indique pour des valeurs non mutables, c'est que vous pouvez utiliser == En tant que vérification rapide pour décider si deux valeurs non mutables sont égales (=). S'ils comparent physiquement égaux, ils sont égaux de valeur. S'ils ne comparent pas physiquement égaux, vous ne savez pas s'il s'agit d'une valeur égale. Vous devez toujours utiliser = decider.

28
Jeffrey Scofield

Est-ce que x = y dans ocaml juste comme x.equals (y) en Java?

et x == Y juste comme x == y (comparer l'adresse) en Java?

Oui c'est ça. Sauf que dans OCAML, vous pouvez utiliser = sur chaque type de valeur, alors que In Java vous ne pouvez pas utiliser equals sur des types primitifs. Une autre différence est que les numéros de points flottants dans OCAML sont des types de référence, de sorte que vous ne devrait pas les comparer en utilisant == (Ce n'est généralement pas une bonne idée de comparer les numéros de points flottants directement pour l'égalité de toute façon).

Donc, en résumé, vous devriez toujours utiliser = Pour comparer n'importe quel type de valeurs.

8
sepp2k

selon http://rigaux.org/language-study/yntax-across-languages-per-language/ocaml.html , == vérifie l'égalité peu profonde et = chèques pour l'égalité profonde

2
Sam I am