有人说C#可以被认为是一种函数式编程语言,尽管它被广泛认为是一种OO编程语言.
那么,什么功能集使C#成为一种函数式编程语言?
我只能想到:
委托(即使没有匿名方法和lambda表达式)
关闭
还要别的吗?
例如,C#借用了ML和Haskell的许多功能:
C#2.0为我们带来了参数多态(或"泛型").我听说过F#的创建者之一Dom Syme主要负责在.NET BCL中实现泛型.
C#2.0还允许程序员传递和返回函数作为高阶函数的值,并且对匿名委托的支持有限.
C#3.0和3.5改进了对真正闭包的支持匿名函数.
LINQ可以被认为是C#自己的列表推导的味道.
匿名类型看起来像ML记录的近似值
类型推断是给定的.
我不了解你,但C#扩展方法看起来很像Haskell 类型.
在C#4.0中有很多关于"动态"关键字的讨论.我不是100%确定它的实现细节,但我很确定它会使用结构类型而不是后期绑定来保留C#的编译时间安全性.结构类型大致相当于"静态语言的鸭子打字",这是Haskell和ML黑客多年来一直享受的功能.
这并不是说C#是一种函数式编程语言.它仍然缺少重要的功能,如模式匹配,尾部调用优化,以及列表和元组文字.此外,惯用的C#基本上是必要的,严重依赖于可变状态.
我不一定会认为上面提到的某些功能是函数式编程语言所独有的,但很明显C#开发人员在过去几年中从函数式编程语言中获得了很多灵感.
对于"OO语言","功能语言","程序语言"没有严格的定义,人们可以说任何语言都适合任何分类; 一个人可以编写过程Java,面向对象的C和功能C++.我通常使用基于主要语义特征支持的分类以及常见的开发实践.查看内容和流行框架的一个好方法是查看它们使用的样式.
函数式语言大多被定义为具有第一类函数原语的函数语言,其开发风格使用这些函数来降低像"map"这样的习语的复杂性.另一个常见的功能是模式匹配,但我不认为这是完全功能."纯粹的"功能语言也没有副作用,但这不是强制性的(看看这些概念有多模糊?:).
那么,什么是C#?好吧,它有一流的函数样式原语,带有委托(并且已经获得了对具有匿名委托和lambdas的样式的更好的语法支持).这是否有用?也许,如果一个人写一个功能风格.框架是否使用此样式?不,不是真的.
因此,我不会将C#作为一般性讨论中的功能 - 它充其量只是多范式,具有一些功能性.
代表和闭包允许它以很大功能的方式运行......例如:
var sum = data.Sum(x=>x.SomeProp);
等等
您可以使用lambdas/delegates编写大多数高阶函数.类型推断与纯函数语言(如F#)并不完全相同,但C#泛型类推理仍然相当不错(特别是在C#3.0中).
在.NET 3.5和C#3.0中尤其如此,其中LINQ对许多问题采用了高功能方法.但是你仍然可以使用C#与.NET 2.0和C#2.0的功能方面.使用C#3.0和lambdas ;-p更容易
实际上,C#是一种实用的编程语言.它旨在使用一些范例成为可能,如果你想做一些与众不同的事情,不要害怕地惩罚你.
函数指针是C#在函数类别中具有的另一个特性.
但是,我不认为C#被广泛认为是一种功能语言.我认为要指出的是,你可以在一个函数式程序是非常重要的风格在许多语言不属于纯粹的功能.
从功能编程:
在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据.它强调功能的应用,与强调状态变化的命令式编程风格形成对比.
使用该定义,您几乎可以使用任何过程语言编写功能样式. 纯功能语言只是强制执行它.