Language-ext Aggregate exceptions/failures when Try<IEnumerable<Try<...>>>

Language-ext Aggregate exceptions/failures when Try<IEnumerable<Try<...>>>

我对出色的 language-ext c# 库很陌生。

我有这样的代码 returns 一个 Try<IEnumerable<Try<Unit>> 对象:

            Try(DetectAlertsToNotify)
            .MapT(SendNotification)
            //treat errors happened indifferently from their source

编辑:DetectAlertsToNotify returns AlertDTO 的 IEnumerable

我想要实现的是优雅地处理所有异常,或者可能是 DetectAlertsToNotify 或 SendNotification 中发生的第一个异常。

如何汇总所有错误或找出 Try<IEnumerable<Try<Unit>> 的第一个错误,同时尽可能保持代码简单和最少?

也许您正在寻找这样的东西:

using LanguageExt;
using static LanguageExt.Prelude;

Try<Unit> Send(string message)
{
    return Try(unit);
}

Try<Arr<string>> GetList()
{
    return Try(Array("a", "b", "c"));
}

// LINQ style (better for longer chains)
var errorOrAllResults1 =
    from inputs in GetList()
    from results in inputs.Map(Send).Sequence()
    select results;

// method style
var errorOrAllResults2 = GetList().Bind(inputs => inputs.Map(Send).Sequence());

备注:

  • 我使用 Arr<T> 而不是 IEnumerable<T> 因为这可以确保在 Try 之外没有枚举,以防枚举时可能引发异常。否则我们可能需要一些助手来确保枚举本身在某些 Try.
  • 中被捕获
  • Sequence() 将更改内部和外部 monad(容器)。这会将 Arr<Try<Unit>> 变成 Try<Arr<Unit>>。我们需要这个,因为我们 want/need “停留”在 Try monad(LINQ 表达式)中。

如果您查看中间类型,您可能会明白这一点。