Большинство примеров монадов, которые я видел в С#, написаны несколько так:
public static Identity<B> Bind<A, B>(this Identity<A> a, Func<A, Identity<B>> func) {
return func(a.Value);
}
Например, см. http://mikehadlow.blogspot.com/2011/01/monads-in-c-3-creating-our-first-monad.html.
Вопрос в том, в какой точке требуется func вернуть Identity<B>? Если я использую следующее определение:
public interface IValue<A> {
public IValue<B> Bind<B>(Func<A, B> func)
}
то я действительно могу использовать те же func для Lazy<T>, Task<T>, Maybe<T> и т.д., фактически не завися от фактического внедрения типа IValue.
Есть ли что-то важное, что мне не хватает здесь?