Объединение монад (IEnumerable и Maybe в качестве примера)

У меня есть общий вопрос и вопрос по конкретному случаю.

Как вообще можно комбинировать разные монады? Допускает ли некоторая комбинация операторов монады легкую композицию? Или нужно написать специальные методы для объединения каждой возможной пары монад?

В качестве конкретного примера я написал монаду Maybe. Как можно использовать IEnumerable > ? Помимо ручного копания в монаде Maybe в расширениях LINQ (таких как: if (might.HasValue) ... в предложениях select ), существует ли «монадический» способ комбинирования этих двух операций с соответствующими операциями монад Bind и т. д.?

В противном случае, если мне нужно написать определенные методы комбинирования, будет ли что-то вроде этого правильным способом сделать это?

    public static IEnumerable<B> SelectMany<A, B>(this IEnumerable<A> sequence, Func<A, IMaybe<B>> func)
    {
        return from item in sequence
               let result = func(item)
               where result.HasValue
               select result.Value;
    }


    public static IEnumerable<C> SelectMany<A, B, C>(this IEnumerable<A> sequence, Func<A, IMaybe<B>> func, Func<A, B, C> selector)
    {
        return from item in sequence
               let value = item
               let maybe = func(item)
               where maybe.HasValue
               select selector(value, maybe.Value);
    }
9
задан CodesInChaos 11 March 2012 в 16:50
поделиться