| Your basic problem is that your programming language can’t express the concept cleanly. You need what’s called “Higher-Kinded Types”. To give you a concrete example, in C# Func<A, B>, List<A> -> List<B> Func<A, B>, Task<A> -> Task<B> Func<A, B>, Func<C, A> -> Func<C, B> Can’t be expressed using a generalisation. But in Haskell, you can write (Functor F) => Func<A,B>, F<A> -> F<B> One of the biggest things that makes monads hard to understand is that the type systems of most languages can’t represent them. Annoying, that includes the “typeless” ones. |