有人说C#可以被视为一种函数式编程语言,尽管它被广泛认为是一种OO编程语言。
那么,什么功能集使C#成为一种函数式编程语言?
我只能想到:
还有别的吗?
答案 0 :(得分:42)
C#从ML和Haskell借用了很多功能,例如:
C#2.0为我们带来了参数多态(或“泛型”)。我听说过F#的创建者之一Dom Syme主要负责在.NET BCL中实现泛型。
C#2.0还允许程序员传递和返回函数作为高阶函数的值,并且对匿名代理的支持有限。
C#3.0和3.5改进了对真正闭包的支持匿名函数。
LINQ可以被认为是C#自己的列表理解风格。
匿名类型看起来像是ML记录的近似值
类型推断是给定的。
我不了解你,但C#extension methods看起来很像Haskell type classes。
在C#4.0中有很多关于“动态”关键字的讨论。我不是100%确定它的实现细节,但我很确定它将使用structural typing而不是后期绑定来保留C#的编译时安全性。结构类型大致相当于“静态语言的鸭子打字”,这是Haskell和ML黑客多年来一直享受的一个特征。
这并不是说C#是一种函数式编程语言。它仍然缺少重要的功能,如模式匹配,尾部调用优化,以及列表和元组文字。此外,惯用的C#从根本上讲是必要的,并且严重依赖于可变状态。
我不一定会认为上面提到的某些功能是函数式编程语言所独有的,但很明显C#开发人员在过去几年中从函数式编程语言中获得了很多灵感。
答案 1 :(得分:37)
没有严格的“OO语言”,“功能语言”,“程序语言”的定义,人们可以说任何语言都适合任何分类;一个人可以编写过程Java,面向对象的C和功能C ++。我通常使用基于主要语义特征支持的分类以及常见的开发实践。查看内容和流行框架的一个好方法是查看它们使用的样式。
函数式语言大多被定义为具有第一类函数原语的函数语言,其开发风格使用这些函数来降低像“map”这样的习语的复杂性。另一个常见的功能是模式匹配,但我不认为这是完全功能。 “纯粹的”功能语言也没有副作用,但这不是强制性的(看看这些概念有多模糊?:)。
那么,什么是C#?好吧,它有一流的函数样式原语,带有委托(并且已经获得了对具有匿名委托和lambdas的样式的更好的语法支持)。这是否有用?也许,如果一个人写一个功能风格。框架是否使用此样式?不,不是真的。
因此,我不会将C#作为一般性讨论中的功能 - 它充其量只是多范式,具有一些功能性。
答案 2 :(得分:9)
嗯,代表和闭包允许它以一种很有效的方式运作......例如:
var sum = data.Sum(x=>x.SomeProp);
等
您可以使用lambdas / delegates编写大多数高阶函数。类型推断与
在.NET 3.5和C#3.0中尤其如此,其中LINQ对许多问题采用了高功能方法。但是你仍然可以使用C#与.NET 2.0和C#2.0的功能方面。使用C#3.0和lambdas ;-p
更容易实际上,C#是一种实用的编程语言。它的目的是让你可以使用一些范例,如果你想做一些与众不同的事情,就不会羞怯地惩罚你。
答案 3 :(得分:6)
函数指针是C#在函数类别中的另一个特性。
但是,我并不认为C#被广泛认为是一种功能语言。我认为重要的是要指出你可以用功能风格编写许多非纯功能的语言。在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据。它强调功能的应用,与强调状态变化的命令式编程风格形成对比。
使用该定义,您可以使用几乎任何过程语言编写功能样式。 Purely functional种语言只会执行它。
答案 4 :(得分:3)
我大多同意这里的其他人,他们说C#被描述为多范式而不是功能。但是我要在C#LINQ中添加功能特性的例子,这是一个用于编写monad的一流且相对容易理解的系统。虽然纯函数式语言不需要使用monad,但Haskell的例子表明它们非常有用。然而,对于许多刚接触Haskell的人来说,这是最困难的事情之一。另一方面,在C#中,很多人现在都在编写LINQ查询,甚至没有意识到他们正在编写monad。
答案 5 :(得分:3)
您可以在Andrew Kennedy(来自MS Research)的演示文稿C# is a functional programming language中找到有关语言功能的精彩概述。我关于functional programming in C# and F#的文章概述了更高层次的观点(特别是到最后)。
吨。
答案 6 :(得分:1)
C#具有一些功能语言功能,例如闭包。 .NET库不是以函数式编写的,因此在实践中C#不是函数式语言。几乎所有事情都是通过突变完成的。集合类型都是可变的。
答案 7 :(得分:0)
这些是使c#起作用的要点 1-Lamba表达 2 - 扩展方法 3-type inferende 4对象和集合初始化器 5瓶盖 6-匿名类型 7- LINQ的