LanguageExt:如何做相当于 Option<T>.Match with a [Union] 的操作?

LanguageExt: How do I do the equivalent of Option<T>.Match with a [Union]?

我想创建一个行为有点像 Option<T> 的联合,但它允许 3 向状态,而不是 2 向状态。这样做的原因是在从数据库加载数据时使用它。

如果我用 Option<T> 做这件事,我会做这样的事情...

Option<Person> jimOpt = Option<Person>.None;
Person jimOpt = await _appDbContext.People.FirstOrDefault(p => p.Id == 1);
jimOpt.Match(person => {
    Console.WriteLine("Jim was found");
  },
  () => {
    Console.WriteLine("No such Jim");
  });

但是,这不会区分何时仍在加载数据和何时找不到人。这意味着当数据正在加载时,Option 处于 None 状态,这在 UI 中给人一种错误的印象,因为它看起来(短暂地)好像数据不是找到了。

我的想法是创建一个像这样的 Union...

[Union]
public interface Loading<T> {
  Loading<T> NotLoaded(); // Initial state, data not loaded yet
  Loading<T> Loaded(T value); // Data loaded successfully
  Loading<T> NotFound(); // Data access complete, but entity not found
}

...并执行类似上面的操作,但在数据访问进行时将其设置为 NotLoaded<Person>,然后在数据访问进行时将其设置为 Loaded<Person>NotFound<Person>完成。

问题是生成的Union在这里似乎没有任何帮助。我认为代码生成的想法是消除很多繁重的工作。

我需要自己实现 MatchMap 等,还是我在代码生成中遗漏了什么?

谢谢。

Match 现在为 Union 类型生成。您还可以使用 c# switch 表达式