首页 > 解决方案 > LanguageExt:我如何做相当于 Option. 与 [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似乎没有什么可以帮助我。我认为代码生成的想法是消除很多繁重的工作。

我是否需要自己实现Match,Map等,或者我在代码生成中遗漏了什么?

谢谢。

标签: c#functional-programminglanguage-ext

解决方案


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


推荐阅读