Haskell和LINQ之间有什么联系吗?

我使用LINQ在C#中编写了一些查询。 过了一会儿,我开始使用Haskell一点点,这是一种函数式编程语言(一种不那么受欢迎的语言),对我来说似乎它们几乎都是一样的。 但我不确定这一点。 请问,如果有人比我更多地使用它们,他们能否告诉我他们在编程原理方面是否几乎相同?

LINQ可以被认为是函数式编程吗?

谢谢。

对我而言,似乎两者几乎都是一回事。 但我不确定这一点。 请问,如果有人比我更多地使用它们,他们能否告诉我他们在编程原理方面是否几乎相同?

是的,LINQ查询理解的设计深受Haskell设计的影响。 当我们设计LINQ时,Haskell专家Erik Meijer加入了C#语言设计委员会; 他的见解非常宝贵。 (我在这个过程结束时加入了设计团队,所以不幸的是,我没有参与所有有趣的曲折,这些年来设计经历了多次;它开始变得更加传统OO而不是最终!)

如果你最近对Haskell进行了认真的探索,那么你可能已经熟悉了monad的想法。 LINQ语法专门设计用于使序列monad上的操作感觉自然,但实际上实现更通用; C#调用“SelectMany”是对任意monad的“绑定”操作的略微修改forms。 你可以使用任何monad实际使用查询理解, 正如我的同事Wes在这里描述的那样 ,但这样做看起来很奇怪,我建议在生产代码中反对它。

LINQ可以被认为是函数式编程吗?

是的,LINQ深受function编程思想的影响。 它旨在将函数视为一等对象,强调对副作用的计算等。

看看Erik Meijer Lecture可能是值得的。 这是对它的描述。

我们带着function语言纯粹主义者和lambda演算的大祭司Erik Meijer博士进入C9讲座,进入function编程世界(你可以感谢Erik的许多function结构,这些结构已经出现在C#等语言中VB.NET。当你使用LINQ时,感谢Erik除了Anders之外。

确实,C#已经获得了函数式编程的某些方面。 首先是lambda语句,作为匿名委托实现。 您现在不再需要将方法定义为属于对象,并且您可以以与任何其他变量类似的方式定义方法。 这允许许多function类型的构造:

var mult = (a,b)=>a*b; var square = (a)=>Math.Pow(a,2); var multandsquare = (a,b)=>square(mult(a,b)); //None of the above give a lick about what a and b really are, until... multandsquare(5,3); //== 225 

函数式编程的基本范例 – 基本上可以告诉计算机做的任何事情都可以用高阶函数来表达 – 可以应用于C#程序,特别是现在C#实际上具有更高阶函数。 编译器将强制你至少有一个类至少有一个公共main方法(这就是OO的工作原理),但从那时起你只能根据函数来定义几乎所有东西(def:“方法”的子类)采用N个参数并产生1个输出而没有“副作用”)实例化为lambda。

Linq确实有一些function结构。 基本上它的方法链范例是monadic处理的一个例子,它是如何通过函数语言中的操作封装(现在在C#中)来构造操作序列的。 在IEnumerable上调用Linq方法会返回另一个IEnumerable,它实际上是一个不同的具体类,它包含源Enumerable的句柄和一些要执行的lambda。 您可以非常简单地用函数式语言复制它; 它是源的元组(本身是当前元素的元组和其他所有元素)和一个执行的函数,它将源元组转换为结果,一次一个元素(在Linq中,因为它将在函数中实现) language,是将某些操作嵌套到定义的“汇总”函数中。 调用必须产生实际答案的方法(具体的类型结果),并充分评估所有这些函数以产生所需的结果。

LINQ也可以被认为是函数式编程吗?

LINQ意味着一种function风格,因为它类似于SQL select,原则上它是只读的。 但是,因为.NET中的LINQ子句是由普通的CLR例程实现的,所以没有什么可以阻止LINQ表达式修改状态。

另一方面,Haskell是一种“纯粹的”函数式语言,因此表达式无法修改全局状态。 尽管可以执行IO和图形操作,但这些操作使用与.NET中任何东西完全不同的惯用语来执行 – 包括F#,它允许您或多或少透明地使用程序样式。