public IMorphism <TSource, TResult, IMonoid <T> > o <TSource, TMiddle, TResult>( IMorphism <TMiddle, TResult, IMonoid <T> > m2, IMorphism <TSource, TMiddle, IMonoid <T> > m1) { if (!(typeof(T).IsAssignableFrom(typeof(TSource)) && typeof(T).IsAssignableFrom(typeof(TMiddle)) && typeof(T).IsAssignableFrom(typeof(TResult)))) { throw new InvalidOperationException($"Category {nameof(Monoid<T>)} has only 1 object {nameof(T)}."); } return(new MonoidMorphism <T>( this, _ => this.Binary( (T)(object)m1.Invoke((TSource)(object)this.Unit), (T)(object)m2.Invoke((TMiddle)(object)this.Unit))) as IMorphism <TSource, TResult, IMonoid <T> >); }
public IMorphism <TSource, TResult, DotNet> o <TSource, TMiddle, TResult> (IMorphism <TMiddle, TResult, DotNet> m2, IMorphism <TSource, TMiddle, DotNet> m1) => new DotNetMorphism <TSource, TResult>(@object => m2.Invoke(m1.Invoke(@object)));