一等函数与Applicative编程

简介: 一等函数与Applicative编程

函数是一等公民

函数式编程中,函数被当作一等公民,可以去任何值去的地方,很少有限制。
例如
函数可以与数字一样存储为变量

var fortytwo = function(){  return 42; }

函数与数字一样可以存储为数组的一个元素

var fotytwos = [42,function(){ return 42}]

函数与数字一样可以作为对象的成员变量

var fortytwos = { number:42,fun:function(){ return 42;}}

函数与数字一样可以在使用的时候被直接创建出来

42 + ( function(){ return 42});

函数与数字一样可以被传递给另外一个函数

function weirAdd(n,f){ return n + f()};
weirdAdd(42,function(){ return 42;})

函数与数字一样可以被另外一个函数返回

return 42;
return function(){ return 42;}

高阶函数

  1. 以一个函数作为参数
  2. 返回一个函数作为结果
    例如:
_.each(["boy","girl","decision"],function(word){
        console.log(word.charAt(0).toUpperCase() + word.substr(1));
});

Aplicative编程

Applicative编程定义为函数A作为参数提供给函数B.三个典型的例子是map,reduce和filter.

var nums = [1,2,3,4,5];
function doubleAll(array){
  return _.map(array,function(n){
     return n *2;
  });}; 
  doubleAll(nums); function average(array){ 
    var sum = _.reduce(array,function(a,b){return a + b;});
    return sum / _.size(array);
  }  
  average(nums); 
  function onlyEven(array){
     return _.filter(array,function(n){
        return (n%2) === 0;
    });
  } 
  onlyEven(nums);

_.map 遍历集合并对其每一个值调用一个函数,反悔结果的集合
_.reduce 利用函数将值的集合合并成一个值,该函数接受一个积累值和本次处理的值
_.filter 对集合的每一个值调用一个谓词函数(返回true或false的函数),抽取谓词函数返回true的值的集合。
_.reduceRight 从右到左的运算
_.find 接受一个集合和一个谓词函数,并返回该谓词为true时的第一个元素

_.find(['a','b',3,'d'],_.isNumber) //=> 3

reject 本质上是_.filter的逆
all 接受一个集合和一个谓词

_.all([1,2,3,4],_.isNumber); //=>true

any 接受一个集合和一个谓词

_.any([1,2,'c',4],_.isString); //=>true

sortBy,groupBy和countBy

var people = [{name:"Rick",age:30},{name:"Jaka",age:24}]; 
_.sortBy(people,function(p){ return p.age}); //=>[{"name":"Jaka",age:24},{name:"Rick",age:30}];
  var albums=[{title:"Sabbatch Bloody Sabbatch",genre:"Metal"},{title:"Scientist",genre:"Dub"},{title:"Undertow",genre:"Metal"}]; 
  _.groupBy(albums,function(a){ return a.genre}); 
  //=> {
  //=>  Metal:[{title:"Sabbatch Bloody Sabbatch",genre:"Mental"},
  //=> {title:"Undertow",genre:"Metal"}],
  //=> Dub:[{title:"Scientist",genre:"Dub"}] } 
_.countBy(albums,function(a){ return a.genre});
   //=> {Metal:2,Dub:1}
目录
相关文章
|
4月前
|
存储 开发者 Python
探索代码的奥秘:从变量到函数的编程之旅
【8月更文挑战第31天】本文将带你走进编程的世界,从基础的变量概念出发,逐步深入到复杂的函数设计。我们将通过实际的代码示例,探讨如何高效地组织和复用代码,以及在面对复杂问题时如何应用模块化思维来简化解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和启发,帮助你更好地理解编程语言的内在逻辑和美学。
|
7月前
|
存储 编译器 C++
C++程序中的函数调用:模块化编程的基石
C++程序中的函数调用:模块化编程的基石
69 1
|
7月前
|
存储 编译器 C语言
“编程界的隐形斗篷:C语言作用域与生命周期的喜怒哀乐”
“编程界的隐形斗篷:C语言作用域与生命周期的喜怒哀乐”
|
7月前
|
并行计算 数据处理 开发者
Python函数式编程:探索优雅的编程范式
传统的编程范式中,命令式编程和面向对象编程占据主导地位。然而,Python函数式编程作为一种新颖而强大的范式,通过引入函数作为一等公民和不可变性等特性,为开发者提供了更加优雅和灵活的编码方式。本文将深入探讨Python函数式编程的概念与应用,包括高阶函数、纯函数、惰性计算以及函数式编程在并行处理和数据处理方面的实际应用。
|
7月前
|
Serverless 开发者 Python
Python函数式编程:从概念到应用的完整指南
在 Python 中,函数式编程是一种流行且强大的编程范式,它不仅可以使代码更加简洁、优雅,而且还能提高程序的可读性和可维护性。本文将从基础概念入手,详细讲解 Python 函数式编程的核心思想、常用函数和实际应用。无论你是 Python 新手还是经验丰富的开发者,本文都能为你提供全面的参考和指导。
|
存储 Java C语言
从C语言的面向过程编程过渡理解面向对象编程风格中的封装
从C语言的面向过程编程过渡理解面向对象编程风格中的封装
98 0
|
Go
高阶函数编程:探索Go语言中的函数一等公民
Go 函数一等公民。你是否听说过 `Go` 语言中的函数是一等公民?如果没有,那么恭喜你,本文将带你一起揭开这个神秘的面纱。如果你已经了解这个概念,你是否知道为什么 `Go` 语言中的函数被称为一等公民?不管你的答案是什么,通过阅读本文,你将对这个概念有更深入的了解。
96 0
高阶函数编程:探索Go语言中的函数一等公民
|
存储 关系型数据库 Python
函数式编程:一等对象、作用域和高阶函数的综合指南
函数式编程:一等对象、作用域和高阶函数的综合指南
57 0
|
设计模式 算法 Java
当函数成为一等公民时,设计模式的变化
当函数成为一等公民时,设计模式的变化
当函数成为一等公民时,设计模式的变化
|
JavaScript 前端开发 索引
【重温基础】21.高阶函数
【重温基础】21.高阶函数
139 0