У меня есть общий вопрос и вопрос по конкретному случаю.
Как вообще можно комбинировать разные монады? Допускает ли некоторая комбинация операторов монады легкую композицию? Или нужно написать специальные методы для объединения каждой возможной пары монад?
В качестве конкретного примера я написал монаду 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);
}