Language-ext 在 Try<IEnumerable<Try<...>>> 时聚合异常/失败
Posted
技术标签:
【中文标题】Language-ext 在 Try<IEnumerable<Try<...>>> 时聚合异常/失败【英文标题】:Language-ext Aggregate exceptions/failures when Try<IEnumerable<Try<...>>> 【发布时间】:2021-08-15 03:28:37 【问题描述】:我对出色的语言-ext c# 库很陌生。
我有这段代码返回一个Try<IEnumerable<Try<Unit>>
对象:
Try(DetectAlertsToNotify)
.MapT(SendNotification)
//treat errors happened indifferently from their source
编辑:DetectAlertsToNotify 返回一个 IEnumerable 的 AlertDTO
我想要实现的是优雅地处理所有异常,或者可能是第一个异常,无论它发生在 DetectAlertsToNotify 或 SendNotification 中。
如何聚合所有错误或获取Try<IEnumerable<Try<Unit>>
的第一个错误,同时保持代码尽可能简单和最少?
【问题讨论】:
你能给我们更多的代码吗?我正在尝试创建您的示例的工作版本,但找不到与Try<Unit>
一起使用的MapT
版本。看起来DetectAlertsToNotify
返回Unit
,对吗?所以Try(DetectAlertsToNotify)
返回Try<Unit>
。不过,我看不到如何在该结果上调用MapT
。 (我有 F#/Haskell 经验,但之前从未使用过 LanguageExt。)
谢谢,事实上 DetectAlertsToNotify 返回一个 IEnumerable
好的,但是Try<Unit>
来自哪里? Try(DetectAlertsToNotify)
将返回 Try<IEnumerable<AlertDTO>>
,但我仍然看不到任何将 MapT
应用于该类型的方法。
【参考方案1】:
也许你正在寻找这样的东西:
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>>
。我们需要这个,因为我们想要/需要“留在”Try
monad(LINQ 表达式)中。
如果您查看中间类型,您可能会明白。
【讨论】:
非常感谢,这正是我的情况,非常完美。我太专注于使用 MapT 将所有表达式保持在同一水平上。现在我明白了与 Bind 保持在同一个 monad 中的意义。以上是关于Language-ext 在 Try<IEnumerable<Try<...>>> 时聚合异常/失败的主要内容,如果未能解决你的问题,请参考以下文章