gpt4 book ai didi

c# - 使这项工作起作用的流畅对象模型是什么?

转载 作者:可可西里 更新时间:2023-11-01 07:46:03 26 4
gpt4 key购买 nike

作为编写流畅 API 的练习,我想我会编译并运行以下代码:

static void Main(string[] args)
{
Enumerable.Range(1, 100)
.When(i => i % 3 == 0).Then(i => Console.WriteLine("fizz"))
.When(i => i % 5 == 0).Then(i => Console.WriteLine("buzz"))
.Otherwise(i => Console.WriteLine(i))
.Run();

Console.ReadLine();
}

想法是.When将测试枚举中的每个元素,如果它通过谓词,则运行操作。如果谓词失败,则该项目沿链向下传递。

我想出的图表是:

public static class EnumerableExtensions
{
public static IConditionalEnumerable<T> When<T>(this IEnumerable<T> items, Predicate<T> test, Action<T> action)
{
}

public static IResolvedEnumerable<T> Then<T>(this IConditionalEnumerable<T> items, Predicate<T> test, Action<T> action)
{
}

public static void Run<T>(this IEnumerable<T> items)
{
foreach (var item in items) ;
}
}

public interface IConditionalEnumerable<T> : IEnumerable<T>
{
IResolvedEnumerable<T> Then<T>(IConditionalEnumerable<T> items, Action<T> action);
}

public interface IResolvedEnumerable<T> : IEnumerable<T>
{
IEnumerable<T> Otherwise(Action<T> behavior);
}

我遇到了一个问题 -- When不能 foreach / yield return在里面,因为返回类型不是直接IEnumerable<T> (尽管它继承自它)。这让精神上的 Spanner 陷入了困境。扩展方法的实现是什么样的?

最佳答案

不要担心序列。只需按照值(value)观去做。

您完全可以使用扩展方法来做到这一点。事情是这样的:

  • 不知何故Otherwise需要知道以前是否有Then执行。
  • 因此以某种方式每When需要知道是否每一个以前的 Then执行。
  • 每个Then需要知道以前的When是否是对还是错。

这是骨架:

static class X 
{
public enum WhenState { DoIt, DoNot }
public enum ThenState { DidIt, DidNot }
public static (T, ThenState) Begin<T>(this T item) { ... }
public static (T, WhenState, ThenState) When<T>(
this (T item, ThenState then) tuple,
Func<T, bool> p) { ... }
public static (T, ThenState) Then<T>(
this (T item, WhenState when, ThenState then) tuple,
Action<T> a) { ... }
public static void Otherwise<T>(
this (T item, ThenState then) tuple,
Action<T> a) { ... }

一旦您实现了这些扩展方法,您就可以:

3.Begin().When(x => x % 3 == 0).Then( ... )

等等。

一旦你实现了它,就很容易将操作提升到序列。我们有一个将值(value)观转化为行动的设备;什么是将一系列值转换为一系列 Action 的设备?它内置于语言中:foreach(var item in items) item.Begin()... .

同样,很容易将操作提升到任何其他 monad。说,可以为空。我们有一个将值(value)观转化为行动的设备。将可空值转换为 Action 或无 Action 的设备是什么?它内置于语言中:x?.Begin()...

假设您希望将操作应用于 Task<int> ;将 future 值(value)转化为 future 行动的设备是什么? async Task DoIt(Task<T> task) { (await task).Begin()... .

等等。 根据值(value)观而不是提升的值(value)观实现您的运营;使用语言的内置提升操作将您的操作应用于提升值以产生提升操作。

关于c# - 使这项工作起作用的流畅对象模型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com