【问题标题】:LanguageExt: How do I do the equivalent of Option<T>.Match with a [Union]?LanguageExt:如何使用 [Union] 执行相当于 Option<T>.Match 的操作?
【发布时间】:2021-07-19 23:33:08
【问题描述】:

我想创建一个类似于Option&lt;T&gt; 的联合,但它允许 3 向状态,而不是 2 向状态。这样做的原因是在从数据库加载数据时使用它。

如果我用Option&lt;T&gt; 来做这件事,我会做这样的事情......

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&lt;Person&gt;,然后在数据访问完成时将其设置为Loaded&lt;Person&gt;NotFound&lt;Person&gt;

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

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

谢谢。

【问题讨论】:

    标签: c# functional-programming language-ext


    【解决方案1】:

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

    【讨论】:

    • 感谢 Paul,我想我们前段时间在 GitHub 问题中解决了这个问题。我忘了我在这里问过!
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2013-01-07
    • 2011-09-07
    • 2018-04-12
    • 1970-01-01
    相关资源
    最近更新 更多