Skip to main content

fp_library/classes/
field.rs

1//! Types that form a field (commutative division ring with Euclidean structure).
2//!
3//! ### Examples
4//!
5//! ```
6//! use fp_library::classes::{
7//! 	DivisionRing,
8//! 	EuclideanRing,
9//! 	Semiring,
10//! };
11//!
12//! let a = 6.0f64;
13//! let b = 2.0f64;
14//! assert_eq!(f64::divide(a, b), 3.0);
15//! assert_eq!(f64::reciprocate(b), 0.5);
16//! ```
17
18#[fp_macros::document_module]
19mod inner {
20	use {
21		crate::classes::*,
22		fp_macros::*,
23	};
24
25	/// A marker trait for types that form a field.
26	///
27	/// A field is both an [`EuclideanRing`] and a [`DivisionRing`],
28	/// combining commutative ring structure with multiplicative inverses.
29	///
30	/// ### Laws
31	///
32	/// All [`EuclideanRing`] and [`DivisionRing`] laws apply.
33	#[document_examples]
34	///
35	/// ```
36	/// use fp_library::classes::{
37	/// 	DivisionRing,
38	/// 	Semiring,
39	/// };
40	///
41	/// // For fields, multiply(a, reciprocate(a)) = one
42	/// let a = 3.0f64;
43	/// assert_eq!(f64::multiply(a, f64::reciprocate(a)), f64::one());
44	/// ```
45	pub trait Field: EuclideanRing + DivisionRing {}
46
47	impl Field for f32 {}
48	impl Field for f64 {}
49}
50
51pub use inner::*;