美文网首页
函数式编程

函数式编程

作者: 青乌 | 来源:发表于2022-03-11 19:27 被阅读0次

与指令编程相比,函数式编程就是考虑利用已有的函数去解决问题。指令编程是根据基础步骤一步步完成。
函数编程是不同逻辑的组合,指令编程是利用最基础的API一点点组合。

概念理解总体来说就是:
  1. 代码函数组合
  2. 目的封装组合复用
  3. 函数逻辑而非过程逻辑
函数式编程的几大特点

1. 函数式编程是一等公民
所谓一等公民就是说跟基础的数据类型同等地位。

2. 只用"表达式",不用"语句"
表达式就是说单纯运算,返回结果。语句是执行步骤。类似加法和计算1+1等于几的区别。

3.没有"副作用"
内部计算,不对外不产生影响。

4.不修改状态
变量不可改变,没有状态改变和中间值。递归函数中只返回不改变变量值,使用参数承载。没有状态管理危机。

5.引用透明
输入值计算出唯一输出

柯里化

返回函数

function fun(param1){
  return function(param2){
    return param1+param2
  }
}

简化参数

function getTotalUrl(protocol){
  return function(hostname,path){
    return protocol + hostname + path
  }
}
const getUrl = getTotalUrl("https://");
const url1 = getUrl("baidu.com","/知道")
const url2 = getUrl("baidu.com","/问答")

动态创建函数

//listener: 回调函数 useCapture: 冒泡
const whichEvent = ( function(){
  if( window.addEventListener ){
    return function (element, type, listener, useCapture){
      element.addEventListener(type,function(e){
        listener.call(element,e)
      },useCapture)
    }
  }else if( window.attachEvent ){
  return function (element, type, handler){
      element.attachEvent("on"+type,function(e){
        handler.call(element,e)
      })
    }
  }
})()

延迟执行

arguments:函数开始后产生的类数组, arguments.length为函数实参个数,arguments.callee引用函数自身。Array.prototype.slice.call( arguments )继承函数的方法。

add(1)(2)
add(1,2,3)(3)
add(1,2,3)(3)(4)
柯里化+递归
//写法1
function add(){
  let args = Array.prototype.slice.call( arguments );
  let inner = function(){
    args.push(...arguments)
    return inner
  }
  inner.toString = function (){
      return args.reduce(function(pre,cur){
        return pre + cur
    })
  }
  return inner
}
//写法2
function currying(func) { 
  const args = [];
  return function result(...rest) { 
    if (rest.length === 0)
      return func(...args);
    args.push(...rest);
    return result;
   }
 }
const add = (...args) => args.reduce((a, b) => a + b); 
const sum = currying(add);
//柯里化函数进一步抽象
function currying(fn, length) {
  length = length || fn.length
  return function (...args) { 
    return args.length >= length? fn.apply(this, args)  : currying(fn.bind(this, ...args), length - args.length)
  }
}
const add = currying((...args) => args.reduce((a, b) => a + b))

相关文章

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • iOS 函数编程 & 链式编程

    函数式(链式)编程 函数式编程概念 函数式编程是种编程范式 函数式编程 Functional Programmin...

  • 函数式编程(一)—— 前置知识

    为什么要学函数式编程? 什么是函数式编程?函数式编程和面向对象编程的不同对于函数式编程思维方式的理解: 函数式编程...

  • 二十二、函数式编程、面向协议式编程

    函数式编程(Functional Prigramming) 函数式编程 函数式编程(Functional Prig...

  • Python中的函数式编程

    函数式编程 说到函数式编程,我们的重点在于为什么要采用函数式编程,而不是什么是函数式编程。 函数式编程的优点:一、...

  • RxSwift-初探

    函数响应式编程 一:函数式 函数式编程简称FP(Functional Programming),函数式编程就是一种...

  • 《Kotlin入门实战》CH5 | 函数与函数式编程

    函数与函数式编程 函数式编程与命令式编程最大的不同是:函数式编程的焦点在于数据的映射,命令式编程(imperati...

  • 函数响应式编程思想 & RxSwift 核心逻辑(一)

    函数响应式编程思想 函数响应式编程思想即是将函数式编程和响应式编程相结合。 函数式编程 顾名思义,就是像函数一样的...

  • RxJava系列|RxJava简介(一)

    函数响应式编程 函数式编程是一种编程范式。 常见的编程范式有:命令式编程、函数式编程和逻辑式编程。 面向对象就是一...

  • 了解C# 函数式编程

    什么是函数式编程 函数式编程是一种编程范式,维基百科对函数式编程定义如下: 函数式编程(英语:functional...

网友评论

      本文标题:函数式编程

      本文链接:https://www.haomeiwen.com/subject/auqhdrtx.html