docs: Correct terminology in std::cmp · rust-lang/rust@86b031b
@@ -3,14 +3,17 @@
33//! This module contains various tools for comparing and ordering values. In
44//! summary:
55//!
6-//! * [`Eq`] and [`PartialEq`] are traits that allow you to define total and
7-//! partial equality between values, respectively. Implementing them overloads
8-//! the `==` and `!=` operators.
6+//! * [`PartialEq<Rhs>`] overloads the `==` and `!=` operators. In cases where
7+//! `Rhs` (the right hand side's type) is `Self`, this trait corresponds to a
8+//! partial equivalence relation.
9+//! * [`Eq`] indicates that the overloaded `==` operator corresponds to an
10+//! equivalence relation.
911//! * [`Ord`] and [`PartialOrd`] are traits that allow you to define total and
1012//! partial orderings between values, respectively. Implementing them overloads
1113//! the `<`, `<=`, `>`, and `>=` operators.
1214//! * [`Ordering`] is an enum returned by the main functions of [`Ord`] and
13-//! [`PartialOrd`], and describes an ordering.
15+//! [`PartialOrd`], and describes an ordering of two values (less, equal, or
16+//! greater).
1417//! * [`Reverse`] is a struct that allows you to easily reverse an ordering.
1518//! * [`max`] and [`min`] are functions that build off of [`Ord`] and allow you
1619//! to find the maximum or minimum of two values.
@@ -27,16 +30,21 @@ pub(crate) use bytewise::BytewiseEq;
27302831use self::Ordering::*;
293230-/// Trait for equality comparisons.
33+/// Trait for comparisons using the equality operator.
34+///
35+/// Implementing this trait for types provides the `==` and `!=` operators for
36+/// those types.
3137///
3238/// `x.eq(y)` can also be written `x == y`, and `x.ne(y)` can be written `x != y`.
3339/// We use the easier-to-read infix notation in the remainder of this documentation.
3440///
35-/// This trait allows for partial equality, for types that do not have a full
36-/// equivalence relation. For example, in floating point numbers `NaN != NaN`,
37-/// so floating point types implement `PartialEq` but not [`trait@Eq`].
38-/// Formally speaking, when `Rhs == Self`, this trait corresponds to a [partial equivalence
39-/// relation](https://en.wikipedia.org/wiki/Partial_equivalence_relation).
41+/// This trait allows for comparisons using the equality operator, for types
42+/// that do not have a full equivalence relation. For example, in floating point
43+/// numbers `NaN != NaN`, so floating point types implement `PartialEq` but not
44+/// [`trait@Eq`]. Formally speaking, when `Rhs == Self`, this trait corresponds
45+/// to a [partial equivalence relation].
46+///
47+/// [partial equivalence relation]: https://en.wikipedia.org/wiki/Partial_equivalence_relation
4048///
4149/// Implementations must ensure that `eq` and `ne` are consistent with each other:
4250///
@@ -242,15 +250,15 @@ pub macro PartialEq($item:item) {
242250/* compiler built-in */
243251}
244252245-/// Trait for equality comparisons which are [equivalence relations](
253+/// Trait for comparisons corresponding to [equivalence relations](
246254/// https://en.wikipedia.org/wiki/Equivalence_relation).
247255///
248-/// This means, that in addition to `a == b` and `a != b` being strict inverses, the equality must
249-/// be (for all `a`, `b` and `c`):
256+/// This means, that in addition to `a == b` and `a != b` being strict inverses,
257+/// the relation must be (for all `a`, `b` and `c`):
250258///
251259/// - reflexive: `a == a`;
252-/// - symmetric: `a == b` implies `b == a`; and
253-/// - transitive: `a == b` and `b == c` implies `a == c`.
260+/// - symmetric: `a == b` implies `b == a` (required by `PartialEq` as well); and
261+/// - transitive: `a == b` and `b == c` implies `a == c` (required by `PartialEq` as well).
254262///
255263/// This property cannot be checked by the compiler, and therefore `Eq` implies
256264/// [`PartialEq`], and has no extra methods.
@@ -260,6 +268,10 @@ pub macro PartialEq($item:item) {
260268/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
261269/// methods.
262270///
271+/// Implement `Eq` in addition to `PartialEq` if it's guaranteed that
272+/// `PartialEq::eq(a, a)` always returns `true` (reflexivity), in addition to
273+/// the symmetric and transitive properties already required by `PartialEq`.
274+///
263275/// ## Derivable
264276///
265277/// This trait can be used with `#[derive]`. When `derive`d, because `Eq` has
@@ -676,12 +688,19 @@ impl<T: Clone> Clone for Reverse<T> {
676688///
677689/// ## Corollaries
678690///
679-/// From the above and the requirements of `PartialOrd`, it follows that `<` defines a strict total order.
680-/// This means that for all `a`, `b` and `c`:
691+/// From the above and the requirements of `PartialOrd`, it follows that for
692+/// all `a`, `b` and `c`:
681693///
682694/// - exactly one of `a < b`, `a == b` or `a > b` is true; and
683695/// - `<` is transitive: `a < b` and `b < c` implies `a < c`. The same must hold for both `==` and `>`.
684696///
697+/// Mathematically speaking, the `<` operator defines a strict [weak order]. In
698+/// cases where `==` conforms to mathematical equality, it also defines a
699+/// strict [total order].
700+///
701+/// [weak order]: https://en.wikipedia.org/wiki/Weak_ordering
702+/// [total order]: https://en.wikipedia.org/wiki/Total_order
703+///
685704/// ## Derivable
686705///
687706/// This trait can be used with `#[derive]`.
@@ -920,6 +939,20 @@ pub macro Ord($item:item) {
920939/// - transitivity of `>`: if `a > b` and `b > c` then `a > c`
921940/// - duality of `partial_cmp`: `partial_cmp(a, b) == partial_cmp(b, a).map(Ordering::reverse)`
922941///
942+/// ## Strict and non-strict partial orders
943+///
944+/// The `<` and `>` operators behave according to a *strict* partial order.
945+/// However, `<=` and `>=` do **not** behave according to a *non-strict*
946+/// partial order.
947+/// That is because mathematically, a non-strict partial order would require
948+/// reflexivity, i.e. `a <= a` would need to be true for every `a`. This isn't
949+/// always the case for types that implement `PartialOrd`, for example:
950+///
951+/// ```
952+/// let a = f64::sqrt(-1.0);
953+/// assert_eq!(a <= a, false);
954+/// ```
955+///
923956/// ## Derivable
924957///
925958/// This trait can be used with `#[derive]`.