Am I cheating here by using Concat? That will aggregate again inside the same container(monad). Will it use SelectMany inside?
I could do SelectMany with Aggregate by exiting the monad and go back again (so I will cause the side effect to exit the monad and break the continuation), right? So:
M<A> -> (A -> M<B>) -> M<B>
M<A> -> B -> (B -> A -> B) -> B
// Aggregate (if accumulator would be type of M<B>):
M<A> -> M<B> -> (M<B> -> A -> M<B>) -> M<B>
// this Aggregate without initial value:
M<A> -> (M<B> -> A -> M<B>) -> M<B>
// This is very near to select many, you can handle the extra parameter in the inner func as you like...
So I can use IEnumerable<T> as accumulator (or could even a Func<...>). On the other hand, LINQ-methods are not pure... e.g. SelectMany is not pure monadic bind: it has some overloads.