//! This file defines the behaviours of R-algebras. //! //! For a functor F, an R-algebra is a natural transformation from F1 //! to the identity functor, where F1 is the functor that sends T to //! F((F(T), T)). This extra F(T) represents the context during the //! computations. use crate::functor::Functor; /// An R-algebra is a function from F((F(T), T)) to T. /// /// This is a "trait alias". Since Rust does not support trait alias /// yet, we define an empty trait with an automatic implementation. pub trait RAlgebra: FnMut((T, F)) -> T where F: Functor, { } impl RAlgebra for R where F: Functor, R: FnMut((T, F)) -> T, { }