Maybe I wasn't clear...

The "predicate(s)" is just anything that holds the definition of the Where predicate:

 Func<TSource, bool> predicate

The "selector(s)" is just anything that holds the definition of the SelectMany selector:

Func<TSource, IEnumerable<TResult>> selector

The concrete implementation doesn't matter.

---

Fold / Aggregate is a kind of visitor pattern to visit every item of the container (monad).

---

The SelectMany (monadic bind) syntax is something like this:

M<A> -> (A -> M<B>) -> M<B>

LINQ deals with immutable collections. So M<A> is not altered/transformed. Instead someone will know how to create a new M<B>. And applying this (A->M<B>) will mean that there must be a way to get A from M<A>. That will need some kind of visitor pattern.