Монады в C # - почему реализации Bind требуют, чтобы переданная функция возвращала монаду?

Большинство примеров монад, которые я видел в C #, написаны примерно так:

public static Identity Bind(this Identity a, Func> func) {
    return func(a.Value);
}

Например, см. http://mikehadlow.blogspot.com/2011/01/monads-in-c-3-creating-our-first-monad.html.

Вопрос в том, зачем требовать func , чтобы вернуть Identity ? Если я использую следующее определение:

public interface IValue {
    public IValue Bind(Func func)
}

, тогда я действительно могу использовать ту же func для Lazy , Task , Maybe и т. Д., Фактически не зависящие от фактического типа, реализующего IValue .

Есть ли что-то важное? Я здесь не хватает?

17
задан Andrey Shchekin 19 October 2011 в 22:13
поделиться