Functional programming 函数式语言能很好地处理复杂性吗?

Functional programming 函数式语言能很好地处理复杂性吗?,functional-programming,complexity-theory,Functional Programming,Complexity Theory,我很好奇在大型程序中,函数式语言与更“传统”的语言(如C#和Java)相比如何。与使用非函数式语言相比,程序流是否变得难以更快地遵循?当使用功能语言编写大型软件项目时,还有其他问题或事项需要考虑吗? 谢谢 我会说相反的话。由于没有副作用,用函数式语言编写的程序更容易推理。函数式编程旨在通过将每个操作与其他操作隔离开来,降低大型系统的复杂性。当你在没有副作用的情况下编程时,你知道你可以单独查看每个函数——是的,理解一个函数可能也包括理解其他函数,但至少你知道它不会干扰其他地方的系统状态 当然,这是

我很好奇在大型程序中,函数式语言与更“传统”的语言(如C#和Java)相比如何。与使用非函数式语言相比,程序流是否变得难以更快地遵循?当使用功能语言编写大型软件项目时,还有其他问题或事项需要考虑吗?


谢谢

我会说相反的话。由于没有副作用,用函数式语言编写的程序更容易推理。

函数式编程旨在通过将每个操作与其他操作隔离开来,降低大型系统的复杂性。当你在没有副作用的情况下编程时,你知道你可以单独查看每个函数——是的,理解一个函数可能也包括理解其他函数,但至少你知道它不会干扰其他地方的系统状态


当然,这是假设完全是纯函数式编程——当然情况并非总是如此。您还可以以函数的方式使用更传统的语言,尽可能避免副作用。但这一原则很重要:避免副作用会产生更易于维护、理解和测试的代码。

通常这不是“功能性”与“程序性”的问题;这相当于一个懒惰的评估问题

惰性评估是指您可以处理值而不实际计算它们;相反,该值附加到一个表达式,如果需要,该表达式应该生成该值。具有惰性计算的语言的主要示例是Haskell。惰性计算允许定义和处理概念上无限的数据结构,因此这很酷,但它也使人类程序员在其头脑中更难以密切跟踪计算机上真正发生的事情的顺序

由于历史原因,大多数具有惰性计算的语言都是“功能性的”。我的意思是,这些语言对典型的功能结构有很好的语法支持


如果没有惰性计算,函数式语言和过程式语言允许表达相同的算法,具有相同的复杂性和相似的“可读性”。函数式语言倾向于重视“纯函数”,即没有副作用的函数。纯函数的求值顺序是不相关的:从这个意义上讲,纯函数通过简单地标记那些不重要的部分来帮助程序员知道发生了什么。但这是一个间接的好处,纯函数也出现在过程语言中。

我可以说,函数语言在处理复杂性方面有以下主要优势:

  • 函数式编程讨厌副作用。 你可以在不同的图层上设置黑盒 而且你不会害怕并行处理 (就像在Erlang中一样,它确实更易于使用 而不是锁和线程)
  • 在文化上,功能程序员 用于设计一个DSL来表示 解决一个问题。确定基本要素 问题的基本要素是一个基本要素 与抢购品牌不同的方法 新潮流框架
  • 历史上,这个领域一直由非常聪明的人领导: 垃圾收集、面向对象、元编程。。。 所有这些概念首先在功能平台上实现。 文学作品很多
  • 但这些语言的缺点是缺乏行业支持和经验。拥有可移植性、性能和互操作性可能是一个真正的挑战,而在Java等其他平台上,所有这些都是显而易见的。也就是说,一种基于JVM的语言,比如Scala,非常适合从双方受益

    程序流程是否变得难以管理 跟在后面比跟在后面更快 是否使用非函数式语言

    这种情况可能是这样的,因为函数式风格鼓励程序员更喜欢从抽象、逻辑转换、将输入映射到输出的角度来思考。从“程序流”的角度考虑,假定一个顺序的、有状态的操作模式——虽然一个功能程序可能“在引擎盖下”具有顺序状态,但它通常不是围绕着这个模式构建的

    通过比较“处理数据集合”的命令式方法和功能性方法,可以很容易地看出视角上的差异。前者倾向于使用结构化迭代,如
    for
    while
    循环,告诉程序“完成这一系列任务,然后移动到下一个任务,并重复,直到完成”。后者倾向于使用抽象递归,如
    折叠
    映射
    函数,告诉程序“这里有一个组合/转换元素的函数——现在就使用它”。无需通过像
    map
    这样的函数遵循递归程序流;因为它是一个无状态抽象,所以只考虑它的含义,而不是它在做什么就足够了

    这也许在某种程度上说明了函数式方法已经慢慢地潜入非函数式语言——考虑
    foreach
    循环,Python的列表理解

    与使用>非函数式语言相比,程序流是否变得更难遵循

    “程序流”可能是分析大型功能程序的错误概念。控制流可以变成巴洛克式的,因为有高阶函数,但这些通常很容易理解,因为很少有共享的可变状态需要担心,所以您可以只考虑参数和结果。当然,根据我的经验,我发现执行一个积极的函数式程序要比执行一个积极的面向对象程序容易得多,因为在这个程序中,实现的一部分被涂抹在许多类上。我发现使用高阶函数编写的程序比使用动态调度编写的程序更容易。我还观察到我的stu