pub trait Ops {
type S;
type F;
// Required methods
fn op(&self, a: Self::S, b: Self::S) -> Self::S;
fn e(&self) -> Self::S;
fn compose(&self, f: Self::F, g: Self::F) -> Self::F;
fn id(&self) -> Self::F;
fn map(&self, f: Self::F, x: Self::S) -> Self::S;
}