函数式编程范式

介绍 函数编程是一种编程范式,在这种范式中,我们试图以纯数学函数的方式绑定所有内容。它是一种声明式编程风格。它的主要关注点是“解决什么”,而命令式风格的主要关注点是“如何解决”。它使用表达式而不是语句。对表达式求值以产生值,而执行语句以分配变量。这些函数具有以下讨论的一些特殊功能。

null

函数式编程基于Lambda演算: Lambda演算是由Alonzo Church开发的一个框架,用于研究函数计算。它可以被称为世界上最小的编程语言。它给出了什么是可计算的定义。任何可以用lambda演算计算的东西都是可计算的。它的计算能力相当于图灵机。它为描述函数及其评估提供了一个理论框架。它构成了当前几乎所有函数式编程语言的基础。 事实:Alan Turing是阿隆佐教堂的学生,他创建了图灵机器,奠定了命令式编程风格的基础。

支持函数式编程的编程语言: Haskell、JavaScript、Python、Scala、Erlang、Lisp、ML、Clojure、OCaml、Common Lisp、Racket。

函数式编程的概念:

  • 纯函数
  • 递归
  • 参考透明度
  • 函数是第一类的,可以是更高阶的
  • 变量是不变的

纯功能: 这些函数有两个主要属性。首先,它们总是为相同的参数生成相同的输出,而不考虑其他任何事情。 其次,它们没有副作用,即它们不会修改任何参数、局部/全局变量或输入/输出流。 之后的属性称为不变性。纯函数的唯一结果是它返回的值。它们是确定性的。 使用函数编程完成的程序很容易调试,因为纯函数没有副作用或隐藏的I/O。纯函数也使编写并行/并发应用程序变得更容易。当代码以这种方式编写时,智能编译器可以做很多事情——它可以并行化指令,在需要时等待计算结果,并记住结果,因为只要输入不变,结果就不会改变。 纯函数的示例:

sum(x, y)           // sum is function taking x and y as arguments    return x + y    // sum is returning sum of x and y without changing them

递归: 函数式语言中没有“for”或“while”循环。函数式语言中的迭代是通过递归实现的。递归函数反复调用自己,直到达到基本情况。 递归函数的示例:

fib(n)    if (n <= 1)        return 1;    else        return fib(n - 1) + fib(n - 2);

参考透明度: 在功能程序中,变量一旦定义,在整个程序中不会改变其值。功能程序没有赋值语句。如果我们必须存储一些值,我们就定义新的变量。这消除了任何副作用的可能性,因为任何变量都可以在任何执行点用其实际值替换。任何变量的状态在任何时刻都是恒定的。

例子:

x = x + 1 // this changes the value assigned to the variable x.          // So the expression is not referentially transparent. 

函数是第一类的,可以是更高阶的: 第一类函数被视为第一类变量。第一类变量可以作为参数传递给函数,可以从函数返回,也可以存储在数据结构中。高阶函数是将其他函数作为参数的函数,它们也可以返回函数。

例子:

show_output(f)            // function show_output is declared taking argument f                           // which are another function    f();                  // calling passed functionprint_gfg()             // declaring another function     print("hello gfg");show_output(print_gfg)  // passing function in another function

变量是不可变的: 在函数式编程中,我们不能在变量初始化后修改它。我们可以创建新变量,但不能修改现有变量,这确实有助于在程序的整个运行时保持状态。一旦我们创建了一个变量并设置了它的值,我们就可以完全相信这个变量的值永远不会改变。

函数式编程的优缺点

优势:

  1. 纯函数更容易理解,因为它们不改变任何状态,只依赖于给定给它们的输入。他们生产的任何产品都是他们给予的回报值。它们的函数签名提供了关于它们的所有信息,即它们的返回类型和参数。
  2. 函数式编程语言将函数视为值,并将其作为参数传递给函数的能力使代码更具可读性和易懂性。
  3. 测试和调试更容易。因为纯函数只接受参数并产生输出,所以它们不会产生任何更改,不会接受输入或产生一些隐藏的输出。它们使用不可变的值,因此检查使用纯函数编写的程序中的一些问题变得更容易。
  4. 它用于实现并发性/并行性,因为纯函数不会更改变量或它之外的任何其他数据。
  5. 它采用延迟求值,避免了重复求值,因为只在需要时才求值和存储值。

缺点:

  1. 有时编写纯函数会降低代码的可读性。
  2. 使用位循环而不是递归方式编写程序可能很可怕。
  3. 编写纯函数很容易,但将它们与应用程序的其余部分和I/O操作结合起来是一项困难的任务。
  4. 不可变的值和递归可能会导致性能下降。

应用:

  • 它用于数学计算。
  • 当需要并发性或并行性时,就需要它。

事实:Whatsapp 9亿美元只需要50名工程师 用户 因为Erlang用于实现其并发需求。Facebook在其反垃圾邮件系统中使用Haskell。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享