【问题标题】:Why is C# a functional programmming language?为什么 C# 是一种函数式编程语言?
【发布时间】:2010-09-28 11:16:09
【问题描述】:

有人说C#可以被视为一种函数式编程语言,尽管它被广泛认为是一种面向对象的编程语言。

那么,是什么特性集使 C# 成为函数式编程语言?

我只能想到:

  1. 委托(即使没有匿名方法和 lambda 表达式)
  2. 关闭

还有什么?

【问题讨论】:

    标签: c# functional-programming


    【解决方案1】:

    这些是使 c# 功能化的要点 1-Lamba 表达式 2-扩展方法 3型推断 4-对象和集合初始化器 5-闭包 6-匿名类型 7-Linq

    【讨论】:

      【解决方案2】:

      您可以在 Andrew Kennedy(来自 MS Research)名为 C# is a functional programming language 的演示文稿中找到有关语言功能的精彩概述。我关于functional programming in C# and F# 的文章从更高层次(尤其是接近尾声)给出了概述。

      T.

      【讨论】:

        【解决方案3】:

        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# 开发人员在过去几年中从函数式编程语言中汲取了很多灵感。

        【讨论】:

        • C# 扩展方法不像类型类。它只是静态方法之上的一种方便语法。
        • 我喜欢扩展方法和自定义运算符之间的类比,尤其是 F# 中的流水线运算符:list |> F# 中的 List.map foo 对应于 C# 中的 list.Map(foo)。
        • 哦,我应该补充一点,.NET 团队正在向 .NET BCL (blogs.msdn.com/bclteam/archive/2008/11/04/…) 添加元组。
        • dynamic 确实使用了后期绑定(而不是结构(子)类型),这就是dynamic 的全部意义所在。
        【解决方案4】:

        我基本上同意这里的其他人的观点,他们说 C# 被描述为多范式而不是函数式更好。但我会在 C# LINQ 中添加功能特性的示例,这是一个用于编写 monad 的一流且相对易于理解的系统。虽然纯函数式语言不需要使用 monad,但 Haskell 的示例表明它们非常有用。然而,对于许多刚接触 Haskell 的人来说,它们是最难掌握的东西之一。另一方面,在 C# 中,如今许多人编写 LINQ 查询时甚至没有意识到他们正在编写 monad。

        【讨论】:

          【解决方案5】:

          函数指针是 C# 在函数类别中的另一个特性。

          但是,我不认为 C# 被广泛认为是一种函数式语言。我确实认为重要的是要指出,您可以在许多非纯函数式语言中以函数式样式进行编程。

          来自Functional Programming

          在计算机科学中,函数式编程是一种编程范式,它将计算视为对数学函数的评估,并避免使用状态和可变数据。它强调函数的应用,而命令式编程风格则强调状态的变化。

          使用该定义,您可以使用几乎任何过程语言以函数式风格进行编程。 Purely functional 语言只是强制执行它。

          【讨论】:

            【解决方案6】:

            好吧,委托和闭包允许它以功能性很强的方式运行......例如:

            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# 是一种实用 编程语言。它旨在使使用多种范式成为可能,而如果您想做不同的事情,则不会受到可怕的惩罚。

            【讨论】:

            • 吹毛求疵:F# 是一种不纯 函数式编程语言,而不是纯粹的语言。大多数人会将 C# 归类为“通用”编程语言(相对于特定领域的语言),它支持多种编程范式,尤其是面向对象和命令式风格。
            【解决方案7】:

            C# 具有一些函数式语言特性,例如闭包。 .NET 库不是以函数式风格编写的,因此实际上 C# 不是函数式语言。几乎所有事情都是通过突变完成的。集合类型都是可变的。

            【讨论】:

              【解决方案8】:

              “面向对象语言”、“功能语言”、“过程语言”没有严格的定义,可以提出任何语言最适合任何分类的论据;可以编写过程式 Java、面向对象的 C 和函数式 C++。我通常使用基于主要语义特征支持的分类以及常见的开发实践。看待这一点的一个好方法是检查内置和流行的框架,看看它们使用什么风格。

              函数式语言大多被定义为具有一流函数原语的语言,其开发风格使用这些原语来降低复杂性,例如“map”。另一个常见功能是模式匹配,但我不认为这是唯一的功能。 “纯”函数式语言也没有副作用,但这不是强制性的(看看这些概念有多模糊?:)。

              那么,什么是 C#?好吧,它具有一流的函数样式原语,带有委托(并且通过匿名委托和 lambda 获得了对样式的更好的语法支持)。这是否使它起作用?也许,如果一个人以实用的风格写作。框架是否使用这种风格?不,不是。

              因此,我不会在一般讨论中将 C# 归类为函数式 - 它充其量是多范式,带有一些函数式风格。

              【讨论】:

              • 另一个值得注意的语言特性是惰性列表(有点像 IEnumerable)。然而,尽管有许多函数式特性,但您在 C# 中使用的编程风格并不实用。
              • 我必须不同意第一句话。采用 OO 设计并手动实现它,例如C 不会使 C 成为 OO 语言。但我确实同意函数式和面向对象的特性在各种语言中变得越来越普遍。
              • @joel.neely:OOP、函数式、结构化、命令式等不是语言特性;它们是设计风格。
              猜你喜欢
              • 1970-01-01
              • 2011-04-01
              • 2019-06-04
              • 2013-07-23
              • 2017-01-14
              • 2011-03-18
              • 1970-01-01
              • 2012-12-29
              • 2010-09-13
              相关资源
              最近更新 更多