加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹰潭站长网 (https://www.0701zz.cn/)- 图像处理、低代码、云通信、数据工具、物联设备!
当前位置: 首页 > 站长资讯 > 动态 > 正文

JavaScript中的组合函数式编程

发布时间:2020-10-10 05:43:04 所属栏目:动态 来源:未知
导读:高阶函数的好处:简洁代码 对于这个好处,一个很好的例子就是Array方法,例如forEach,map,reduce等等。在非函数式编程语言(例如C)中,对数组元素进行迭代并对其进行转换需要使用for循环或某些其他循环结构。这就要求我们以指定方式编写代码,就是需求描述

高阶函数的好处:简洁代码

对于这个好处,一个很好的例子就是Array方法,例如forEach,map,reduce等等。在非函数式编程语言(例如C)中,对数组元素进行迭代并对其进行转换需要使用for循环或某些其他循环结构。这就要求我们以指定方式编写代码,就是需求描述循环发生的过程。


  1. let myArray = [1,2,3,4] 
  2. let transformedArray = [] 
  3.  
  4. for(let i = 0; i < myArray.length; i++) { 
  5.   transformedArray.push(myArray[i] * 2)  

上面的代码主要做了:

  • 声明一个新变量i,该变量将用作myArray的索引,其值的范围为0到myArray的长度
  • 对于i的每个值,将myArray的值在i的位置相乘,并将其添加到transformedArray数组中。

这种方法很有效,而且相对容易理解,然而,这种逻辑的复杂性会随着项目的复杂程度上升而上升,认知负荷也会随之增加。但是,像下面这种方式就更容易阅读:


  1. const double = x => x * 2; 
  2.  
  3. let myArray = [1,2,3,4]; 
  4. let transformedArray = myArray.map(double); 

与第一种方式相比,这种方式更容易阅读,而且由于逻辑隐藏在两个函数(map和double)中,因此你不必担心了解它们的工作原理。你也可以在第一个示例中将乘法逻辑隐藏在函数内部,但是遍历逻辑必须存在,这就增加了一些不必要的阅读阻碍。

柯里化

函数柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。我们来看个例子:


  1. function adder(a, b) { 
  2.   return a + b 
  3.  
  4. // 变成 
  5. const add10 = x => adder(a, 10) 

现在,如果你要做的就是将10添加到一系列值中,则可以调用add10而不是每次都使用相同的第二个参数调用adder。这个事例看起来比较蠢,但它是体现了 柯里化 的理想。

你可以将柯里化视为函数式编程的继承,然后按照这种思路再回到logger的示例,可以得到以下内容:


  1. function log(msg, msgPrefix, output) { 
  2.   output(msgPrefix + msg) 
  3. }  
  4.  
  5. function consoleOutput(msg) { 
  6.   console.log(msg) 
  7.  
  8. function fileOutput(msg) { 
  9.   let filename = "mylogs.log" 
  10.   writeFileSync(msg, filename) 
  11.  
  12. const logger = msg => log(msg, ">>", consoleOutput); 
  13. const fileLogger = msg => log(msg, "::", fileOutput); 

log的函数需要三个参数,而我们将其引入仅需要一个参数的专用版本中,因为其他两个参数已由我们选择。

注意,这里将log函数视为抽象类,只是因为在我的示例中,不想直接使用它,但是这样做是没有限制的,因为这只是一个普通的函数。如果我们使用的是类,则将无法直接实例化它。

组合函数

函数组合就是组合两到多个函数来生成一个新函数的过程。将函数组合在一起,就像将一连串管道扣合在一起,让数据流过一样。

在计算机科学中,函数组合是将简单函数组合成更复杂函数的一种行为或机制。就像数学中通常的函数组成一样,每个函数的结果作为下一个函数的参数传递,而最后一个函数的结果是整个函数的结果。

这是来自维基百科的函数组合的定义,粗体部分是比较关键的部分。使用柯里化时,就没有该限制,我们可以轻松使用预设的函数参数。

 

(编辑:鹰潭站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读