Holy goodness, this series got a lot longer than I expected. I was hoping to get to some actual category theory, but let’s just talk a bit about LINQ and then wrap up. Maybe I’ll do a series on the basics of category theory in the future.
I’ve said several times that SelectMany
is the bind
operation on the sequence monad, but of course there are several overloads of the SelectMany
extension method of IEnumerable<T>
. The one that is bind
is as we previously discussed: (Error checking removed for clarity.)
public static IEnumerable<R> SelectMany<A, R>(
this IEnumerable<A> items,
Func<A, IEnumerable<R>> function)
{
foreach(A outer in items)
foreach(R inner in function(outer))
yield return inner;
}
Now you might think that when you say
from outer in items
from inner in function(outer)
select inner
this translates directly into a call to
items.SelectMany(outer=>function(outer))
This is not what actually happens.
Continue reading →