【发布时间】:2010-09-28 11:16:09
【问题描述】:
有人说C#可以被视为一种函数式编程语言,尽管它被广泛认为是一种面向对象的编程语言。
那么,是什么特性集使 C# 成为函数式编程语言?
我只能想到:
- 委托(即使没有匿名方法和 lambda 表达式)
- 关闭
还有什么?
【问题讨论】:
有人说C#可以被视为一种函数式编程语言,尽管它被广泛认为是一种面向对象的编程语言。
那么,是什么特性集使 C# 成为函数式编程语言?
我只能想到:
还有什么?
【问题讨论】:
这些是使 c# 功能化的要点 1-Lamba 表达式 2-扩展方法 3型推断 4-对象和集合初始化器 5-闭包 6-匿名类型 7-Linq
【讨论】:
您可以在 Andrew Kennedy(来自 MS Research)名为 C# is a functional programming language 的演示文稿中找到有关语言功能的精彩概述。我关于functional programming in C# and F# 的文章从更高层次(尤其是接近尾声)给出了概述。
T.
【讨论】:
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# 开发人员在过去几年中从函数式编程语言中汲取了很多灵感。
【讨论】:
dynamic 确实使用了后期绑定(而不是结构(子)类型),这就是dynamic 的全部意义所在。
我基本上同意这里的其他人的观点,他们说 C# 被描述为多范式而不是函数式更好。但我会在 C# LINQ 中添加功能特性的示例,这是一个用于编写 monad 的一流且相对易于理解的系统。虽然纯函数式语言不需要使用 monad,但 Haskell 的示例表明它们非常有用。然而,对于许多刚接触 Haskell 的人来说,它们是最难掌握的东西之一。另一方面,在 C# 中,如今许多人编写 LINQ 查询时甚至没有意识到他们正在编写 monad。
【讨论】:
函数指针是 C# 在函数类别中的另一个特性。
但是,我不认为 C# 被广泛认为是一种函数式语言。我确实认为重要的是要指出,您可以在许多非纯函数式语言中以函数式样式进行编程。
在计算机科学中,函数式编程是一种编程范式,它将计算视为对数学函数的评估,并避免使用状态和可变数据。它强调函数的应用,而命令式编程风格则强调状态的变化。
使用该定义,您可以使用几乎任何过程语言以函数式风格进行编程。 Purely functional 语言只是强制执行它。
【讨论】:
好吧,委托和闭包允许它以功能性很强的方式运行......例如:
var sum = data.Sum(x=>x.SomeProp);
等
您可以使用 lambdas / delegates 编写大多数高阶函数。类型推断与 F# 等纯函数式语言相当不同,但 C# 泛型类型推断仍然相当不错(尤其是在 C# 3.0 中)。
在 .NET 3.5 和 C# 3.0 中尤其如此,在这些版本中,LINQ 采用了一种功能强大的方法来解决许多问题。但是您仍然可以在 .NET 2.0 和 C# 2.0 中使用 C# 的功能方面。使用 C# 3.0 和 lambdas 会更容易;-p
实际上,C# 是一种实用 编程语言。它旨在使使用多种范式成为可能,而如果您想做不同的事情,则不会受到可怕的惩罚。
【讨论】:
C# 具有一些函数式语言特性,例如闭包。 .NET 库不是以函数式风格编写的,因此实际上 C# 不是函数式语言。几乎所有事情都是通过突变完成的。集合类型都是可变的。
【讨论】:
“面向对象语言”、“功能语言”、“过程语言”没有严格的定义,可以提出任何语言最适合任何分类的论据;可以编写过程式 Java、面向对象的 C 和函数式 C++。我通常使用基于主要语义特征支持的分类以及常见的开发实践。看待这一点的一个好方法是检查内置和流行的框架,看看它们使用什么风格。
函数式语言大多被定义为具有一流函数原语的语言,其开发风格使用这些原语来降低复杂性,例如“map”。另一个常见功能是模式匹配,但我不认为这是唯一的功能。 “纯”函数式语言也没有副作用,但这不是强制性的(看看这些概念有多模糊?:)。
那么,什么是 C#?好吧,它具有一流的函数样式原语,带有委托(并且通过匿名委托和 lambda 获得了对样式的更好的语法支持)。这是否使它起作用?也许,如果一个人以实用的风格写作。框架是否使用这种风格?不,不是。
因此,我不会在一般讨论中将 C# 归类为函数式 - 它充其量是多范式,带有一些函数式风格。
【讨论】: