gpt4 book ai didi

c# - 对 IEnumerable 以外的类型(monads?)进行操作的 LINQ 查询表达式——可能的用途?

转载 作者:可可西里 更新时间:2023-11-01 08:10:14 27 4
gpt4 key购买 nike

我正在看书Real-world functional programming by Tomas Petricek and Jon Skeet我很难消化关于计算表达式的部分1)(又名 monad)。

通过这本书,我了解到 — 与我以前的经验相反 — LINQ 查询表达式不限于 IEnumerable<T> ,但也可以处理其他自定义类型。这对我来说似乎很有趣,我想知道是否存在查询表达式语法 ( from x in ... select ...) 非常适合的场景。


一些背景信息:

显然,此类自定义类型称为计算类型,它们被描述为与monads in Haskell 本质上相同的事物。 .我一直无法理解 monad 到底是什么,但根据这本书,它们是通过称为 bindreturn 的两个操作定义的。

在函数式编程中,这两个操作的类型签名是(我认为):

//    Bind      :    M<A'> -> (A' -> B') -> M<B'>
//
// Return : A' -> M<A'>

哪里M是 monadic 类型的名称。

在 C# 中,这对应于:

Func< M<A>, Func<A,B>, M<B> >   Bind;

Func< A, M<A> > Return;

事实证明,LINQ 的 Enumerable.Select (投影运算符)与带有 M := IEnumerable 的绑定(bind)操作具有完全相同的签名.

我的自定义 LINQ 计算类型:

利用这些知识,我现在可以编写一个不是 IEnumerable 的自定义计算类型:

// my custom computation type:
class Wrapped<A>
{
// this corresponds to the Return operation:
public Wrapped(A value)
{
this.Value = value;
}

public readonly A Value;
}

static class Wrapped
{
// this corresponds to the Bind operation:
public static Wrapped<B> Select<A, B>(this Wrapped<A> x, Func<A,B> selector)
{
return new Wrapped<B>(selector(x.Value));
}
}

现在我可以使用 Wrapped<T>在 LINQ 查询表达式中,例如:

Wrapped<int> wrapped = new Wrapped<int>(41);

Wrapped<int> answer = from x in wrapped // works on int values instead
select x + 1; // of Wrapped<int> values!

当然这个例子不是很有用,但它演示了如何查询表达式可以做一些除了处理集合之外的事情,例如使用某种类型包装和解包值。


问题:

上面的计算类型似乎不是很有用。因此我想知道,除了处理集合之外,还有什么其他合理的用途(除了处理集合)可以利用 LINQ 查询表达式?


1) 第 12.4 节:“引入替代工作流程”,从第 334 页开始。

最佳答案

想法:

  • PushLINQ(我和 Jon)- 将 LINQ 反转为推模型(而不是 IEnumerable<T> 拉模型)
  • Reactive Framework/Reactive Extensions - 另一个非常不同的包含 LINQ 语法的事件模型
  • 我使用 LINQ 查询语法编写了一个线程 API (ab);我不是 100% 相信它,所以放弃了它——但它很有趣;二手 from ( SelectMany ) 等来挑选分支/合并点完全与可枚举无关

关于c# - 对 IEnumerable<T> 以外的类型(monads?)进行操作的 LINQ 查询表达式——可能的用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2973140/

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