If you are interested, here are some thoughts about the layman about the role of monads and adjunctions in programming languages:
First of all, for a given monad T there is a unique adherence to the Claysley category T In Haskell, the use of monads is mainly limited to operations in this category (which is essentially a category of free algebras, not relevant). In fact, all you can do with Monk Haskell is to compile some Kleisley morphisms, type a->T b using the expressions do, (>>=) , etc., to create a new morphism. In this context, the role of monads is limited only by the economy of notation. One of them uses morphism associativity to be able to write (say) [0,1,2] instead of (Cons 0 (Cons 1 (Cons 2 Nil))) , that is, you can write a sequence as a sequence, and not as a tree.
Even the use of IO monads is not essential, since the current Haskell-type system is powerful enough to implement data encapsulation (existential types).
This is my answer to your initial question, but I'm curious what Haskell experts have to say about it.
On the other hand, as we have already noted, there is also a 1-1 correspondence between monads and (T-) -algebras. Alignment, in MacLane terms, is "a way to express equivalence of categories." In a typical installation of additions <F,G>:X->A , where F “generator of free algebras” and G is the “forgetful functor”, the corresponding monad will (using T-algebras) describe how (and when) the algebraic structure is constructed A on objects X
In the case of Hask and the monad of the list T, the structure that T introduces is that of a monoid, and this can help us establish the properties (including the correctness) of the code through the algebraic methods that the monoid theory provides. For example, the function foldr (*) e::[a]->a can easily be considered as an associative operation if <a,(*),e> is a monoid, a fact that can be used by the compiler to optimize the calculation (for example, parallelism). Another application is to identify and classify “recursion patterns” in functional programming using categorical methods in the hope of (partially) getting rid of “goto functional programming”, Y (arbitrary recursion combinator).
Apparently, such applications are one of the main motives of the creators of Category Theory (MacLane, Eilenberg, etc.), namely, to establish the natural equivalence of categories and transfer the known method to one category to another (for example, homological methods to topological spaces, algebraic programming methods, etc.). Here, conjugations and monads are indispensable tools for using this combination of categories. (By the way, the concept of monads (and its duals, comonads) is so general that you can even go so far as to define Haskell's “cohomology”. But I haven't thought about it yet.)
As for the undefined functions that you mentioned, I have much less to say ... But note that; if joining <F,G>:Hask->A for some category A defines a list of monad T , there must be a unique "comparison functor" K:A->MonHask (the category of monoids defined in Haskell), see CWM. In fact, this means that your category of interests should be a category of monoids in some limited form (for example, for its absence some partial, but not free algebras may be absent).
Finally, some notes:
The binary tree functor mentioned in my last publication easily generalizes to an arbitrary data type T a1 .. an = T1 T11 .. T1m | ... T a1 .. an = T1 T11 .. T1m | ... Namely, any data type in Haskell naturally defines a monad (along with the corresponding category of algebras and the Claysley category), which is the result of the fact that any data constructor in Haskell is complete. This is another reason why I find the Haskell Monad class not much more than syntactic sugar (which, of course, is pretty important in practice).