Большинство примеров монадов, которые я видел в С#, написаны несколько так:
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
.
Есть ли что-то важное, что мне не хватает здесь?