前端学习之函数式编程—柯里化(代码片段)

萌萌的DDD 萌萌的DDD     2022-12-23     541

关键词:

part 01 -- 柯里化概念

柯里化是为了解决函数中不纯函数或函数硬编码的问题

什么是硬编码

function getAge(age) 
    let min = 18
    return age > min

 函数式编程是保证相同的调用总能得到相同的结果,但当相同的调用有可能不能得到相同的结果时则称之为硬编码。

//函数的柯里化
function checkAge(min) 
    return function(age) 
        return age > min
    


let baseAge = 18

const age18 = checkAge(18)
const age24 = checkAge(24)

console.log(age18(20));  //false
console.log(age24(20));  //true


ES6 // let checkAge = (min) =>  age => age >= min 

柯里化的作用:当函数中有多个参数的时候,我们可以对这个函数进行改造

                         通过闭包的形式,调用这个函数,只传递部分的参数,并且将一个新的函数作为返回值,新的函数用来接收并且返回相应的结果,则称为柯里化。


Part 02 -- 通用的柯里化解决方案 --- lodash.curry

  • 功能:创建一个函数,该函数接受一个或多个func的参数,如果func所需要的参数都被提供则执行func并返回执行的结果。否则既需返回该函数并等待接受剩余的参数。
  • 参数:需要柯里化函数
  • 返回值:柯里化后的函数
  • 作用:将多元,多参数的函数,最终转化成一元的函数
const _ = require('lodash')

function getSum(a, b, c) 
    return a + b + c

const curry = _.curry(getSum)
    // 传递三个参数
console.log(curry(1, 2, 5)); // 8

// 也可以将前两个参数保存起来
const cur1 = curry(1, 2)
    // 传入第三个参数,依然可以获得相同结果
console.log(cur1(5)); // 8

Part 03 -- 柯里化案例

const _ = require('lodash')
const match = _.curry(function(reg, str) 
    return str.match(reg)
)
const haveSpace = match(/\\s+/g)
const haveNumber = match(/\\d+/g)

console.log(haveSpace('hello World')); // [' ']
console.log(haveNumber('abc')); // null

Part 04 -- 柯里化原理模拟

function curry(func) 
    return function curriedFn(...args) 
        // 判断实参和形参的个数
        if (args.length < func.length) 
            return function() 
                return curriedFn(args.concat(Array.from(arguments)))
            
        
        return func(...args)
    

Part 05 -- 柯里化总结

  • 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新韩式
  • 这是一种对于函数的’缓存‘
  • 让函数变得更灵活,让函数颗粒度更小
  • 可以把多元函数转换成一元函数,可以组合使用函数产生的强大的功能

前端学习之函数式编程—函数式编程概念+头等函数(代码片段)

什么是函数式编程函数式编程(functionprogrammingFP)FP是编程范式之一,我们常听说的还有,面向过程编程,面向对象编程函数式编程的思维方式把现实世界的事物和事物之间的联系抽象到程序世界(对运算... 查看详情

前端学习之函数式编程—闭包(代码片段)

闭包Part01闭包的概念闭包(closure):函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包. 可以在另一个作用域中调用一个函数的内部函数并访问到该函数作用域中的成员//函数作为返回值functionmakeFn()letmsg='hellofunction'... 查看详情

前端学习之函数式编程—高阶函数(代码片段)

 什么是高阶函数(Higher-orderfunction)    可以把函数作为参数传递给另一个函数    可以把函数作为另一个函数的返回结果Part1可以把函数作为参数传递给另一个函数实现forEach函数//高阶函数-函数作为参数functionforEach(array,fn)for(... 查看详情

前端学习之函数式编程—纯函数(代码片段)

Part01纯函数概念纯函数:相同的输入永远会得到相同的输出,而且没有任何可观察的副作用纯函数就类似数学中的函数,用来描述输入与输出之间的关系,例如:y=f(x)Part02案例:slice和splice函数 数组的slice和splice分别是纯函数和不纯... 查看详情

函数式编程:纯函数&柯里化&组合函数(代码片段)

函数式编程:纯函数&柯里化&组合函数纯函数函数的柯里化组合函数纯函数相同的输入值,产生相同的输出在函数的执行过程中,不能产生副作用。不能对传入的参数进行修改,不依赖上层作用域内的数据。... 查看详情

javascriptes6函数式编程:柯里化偏应用组合管道(代码片段)

上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心。这一篇来看看高阶函数的实战场景。首先强调两点:注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量高阶函数思想:以变量作用域作为根基,以... 查看详情

函数式编程之一柯里化(代码片段)

什么是柯里化?柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数的函数 下面来看一个案例,两值相加:柯里化之前(常见用法)functionadd(x,y)returnx+yadd(1,2)柯里化之后functionadd(x)returnfunction(y)returnx+yadd(1)(2)从... 查看详情

scala学习之函数式风格编程(代码片段)

FUNCTIONALPROGRAMMINGhttps://docs.scala-lang.org/overviews/scala-book/functional-programming.htmlScala允许您以面向对象编程(OOP)风格、函数式编程(FP)风格甚至混合风格编写代码,结合使用这两种方法。本书假设您是从Java、C++或C#等OOP语言来... 查看详情

swift柯里化(代码片段)

...化(Currying),又称部分求值(PartialEvaluation),是一种函数式编程思想,就是把接受多个参数的函数转换成接收一个单一参数(最初函数的第一个参数)的函数,并且返回一个接受余下参数的新函数技术。uncurried:普通函 查看详情

函数式编程-函数的合成与柯里化

函数式编程有两个最基本的运算:合成和柯里化。2.1函数的合成如果一个值要经过多个函数,才能变成另外一个值,就可以把所有中间步骤合并成一个函数,这叫做"函数的合成"(compose)。上图中,X和Y之间的变形关系是函数f,... 查看详情

javascript函数式编程-包含闭包链式优化及柯里化

本文着重介绍个人理解的函数式编程。函数式编程个人理解为:以函数为主要载体的编程方式。好处:语义更加清晰可复用性高可维护性好作用域局限、副作用少基本函数式编程://实现数组中每个单词首字母大写//一般写法const... 查看详情

函数式编程之柯里化(curry)

 函数式编程curry的概念:只传递给函数一部分参数来调用函数,然后返回一个函数去处理剩下的参数。varadd=function(x){returnfunction(y){returnx+y;};};varincrement=add(1);increment(1)//2varaddTen=add(10);addTen(10)//20我们可以一次性的调用函数,也... 查看详情

#yyds干货盘点#js函数式编程:柯里化

面向对象编程和函数式编程是两种非常不同的编程范式,它们有自己的规则和优缺点。但是,JavaScript并没有一直遵循一个规则,而是正好处于这两个规则的中间,它提供了普通OOP语言的一些方面,比如类、对象、继承等等。但... 查看详情

前端进击的巨人:学会函数柯里化(curry)(代码片段)

柯里化(Curring,以逻辑学家HaskellCurry命名)写在开头柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文。代码例子会用到apply/call,一般用来实现对象冒充,例如字符串冒充数组对象,让字... 查看详情

firstweek(补充完整)(代码片段)

...LandURIPractice:1.TomcatServerinstallation   一、数学和函数式编程函数式编程由Lambda演算得来,因此它与我们学过的数学非常类似。在学习函数式编程之前,我们最好忘记之前头脑中的一些编程思想(如学习CC++的时候),因... 查看详情

柯里化函数(代码片段)

柯里化函数 什么是柯里化?在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Chri... 查看详情

柯里化(代码片段)

柯里化(currying),是指把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下参数而且返回结果的新函数的技术。柯里化是理解装饰器函数的一个非常重要的知识点。比如,将加法... 查看详情

什么是函数式编程?(代码片段)

 纯函数:定义:对于相同的输入永远会得到相同的输出,而且没有任何可以观察的副作用,也不依赖外部的环境状态。 例如数学公式:y=f(x)在javascript中,对于数组的操作,有的是纯的,有的是不存的,如:letarr=[1,2,3,4,5... 查看详情