您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

函数编程(2) <源码交易平台>

  • 时间:2022-09-14 00:15 编辑: 来源: 阅读:301
  • 扫一扫,手机访问
摘要:函数编程(2) <源码交易平台>
纯函数式编程中的函数指的是纯函数,这也是整个函数式编程的核心:相同的输入总会得到相同的输出,没有可观察到的不利影响。 纯函数类似于数学中的函数(用来描述输入和输出的关系)。y = f(x)绿色是对函数的输入,蓝色是对函数的输出,f是函数,是输入和输出的关系。lodash是一个纯函数的函数库。本文提供了几种对数组、数字、对象、字符串、函数等进行操作的方法。来感受一下什么是纯数组和不纯数组:纯函数和不纯函数切片:在不改变原数组切片的情况下返回数组的指定部分:操作数组并返回,会改变原数组let numbers = [1,2,3,4,5]//纯函数编号。[1,2,3]numbers.slice(0,3)//= & gt;[1,2,3]numbers.slice(0,3)//= & gt;[1,2,3]//不纯函数numbers.splice (0,3)//= >;[1,2,3]numbers.splice(0,3)//= & gt;[4,5]numbers.splice(0,3)// = >[]可以看出每次都是相同的输入,slice每次都是相同的输出,所以是纯函数,因为slice会改变原来的数组,虽然每次都是相同的输入变化,所以不纯的函数式编程不会在计算中途保留结果,所以变量是不可变的(无状态)。我们可以把一个函数的执行结果交给另一个函数去求解,就像这个切片,一个纯函数。我们在调用他的时候,会传递参数,然后得到结果,但是在函数内部得不到结果,也就是他不会在内部计算中间保存结果,所以我们认为函数式编程的变量是不可变的。因此,在基于函数的编程过程中,我们往往需要少量细粒度的纯函数。如果我们自己写细粒度的纯函数,不方便写很多。所以我们有很多函数式编程的库,比如Lodash。有了这些细粒度的函数,我们可以把一个函数的执行结果交给另一个函数去求解,还可以组合一个更强大的函数Lodash。我们去官网看看吧。都是有用的方法。纯https://www.html.cn/doc/lodash/函数的好处可以缓存。因为纯函数对于相同的输入总是有相同的结果,所以纯函数的结果可以被缓存。假设有一个超级复杂的计算函数,比如计算地球的体积,它的参数是地球半径,每次计算需要一秒钟,那么我们就可以存储计算结果。因为相同的输入总是有相同的结果,所以有这样一个内存函数memoize const _ = require ('lodash ')函数get volume(r){ console . log(" radius is "+r)return 4/3 * Math。PI * r * r * r } let getVolumeWithMemory = _。memo ize(get volume)console . log(getVolumeWithMemory(10))console . log(getVolumeWithMemory(10))console . log(getVolumeWithMemory(10))//Output://radius为10//4188.79//4188.79。getVolumeWithMemory是由memoize包装后形成的。引用与GetVolume相同。可以看出,半径为10且只执行一次,10 = >;488.79这个结果会被保存,下次遇到的时候会直接得到结果,不需要再执行一次。 我们来模拟一个memo函数memo(f){ let cache = { }//这个缓存是用来缓存结果的,用f的输入参数作为键,输出参数作为值。比如上面的getVolumeWithMemory forms { 10:4188.79 } return function(){ let key = JSON . stringify(arguments)//arguments可能是数组也可能是其他形式,因此,字符串cache[key]= cache[key]| | f . apply(f,arguments)//cache [key]如果存在就取,不存在就执行f。因为参数是数组,所以可以用apply方法return cache[key] }}测试纯函数,使测试更加方便。多线程环境下共享内存数据的并行操作容易导致意外情况。纯函数不需要访问共享内存数据,可以在并行环境下任意运行纯函数(es6新增Web Worker,Js有多线程能力)反应纯函数:对于相同的输入,总是会得到相同的输出,没有可观察到的反应。//不纯let mini = 18函数check(age){ return age >;= mini}//看不纯的。你能保证每次输入20就返回true吗?因为它依赖于一个外部变量,所以无法知道这个变量什么时候会被篡改。//Pure(硬编码,后面可以用Corization处理)函数check(age){ let mini = 18 return age >;= mini}反应使函数不纯(如上例)。纯函数根据相同的输入返回相同的输出。如果函数依赖于外部状态,就不能保证输出不变,就会产生反作用。 除了一些全局变量,所有外部交互,如配置文件、数据库、获取客户输入等。,可能会带来不良影响。不利的影响还降低了方法的通用性,使它们不适合扩展和重用。同时,不利影响会给方案带来安全风险和不确定性。比如客户的账户密码应该存储在数据库中而不是函数中,所以不良影响不能完全禁止,但要尽可能控制在可控范围内。 cori ization这里先来个案例,用cori ization处理硬编码的问题函数check(age){ let mini = 18 return age >;= mini}//既然有硬编码,我们可以通过在min字段传入来处理,所以//普通的纯函数functioncheck (age,min){ returnage >;= min} check (20,18) check (24,18) check (26,30)//假设18,30经常作为基准值,每次输入18,30太重复。//想想我们之前在闭包里是怎么解决的。//Corinized function check(min){//既然基准值总是常数,那么就让基准值通过闭包返回函数(age){ return age >;= min } } let Checkage 18 = Checkage(18)let Checkage 30 = Checkage(30)Checkage 18(24)//再次判断数字时可以不输入18。这是函数Corinthized checkAge18(20)// ES6写的let checkage = min = >;(年龄= & gt年龄& gt= min)科里化:当一个函数有多个参数时,先传递一部分参数来调用它(这部分参数以后永远不会变)然后返回一个新的函数来接收剩下的参数。返回结果。我们来看看普通纯函数变成柯里化函数的过程是不是就像上面定义的那样。由于洛达什的科里化相当常规,所以洛达什也具有库里_的一般功能。curry(func):创建一个接收func的一个或多个参数的函数,如果提供了func所需的所有参数,则执行func并返回执行结果。 否则,继续返回函数,等待接收剩余的参数。 参数:待科里化函数的返回值:科里化函数const _ = require('lodash')//待科里化函数function getSum (a,b,C) {return a+b+c}//科里化后的函数let curried = _。curried (getsum)//Test curried (1,2,3) curried (1) (2) (3) curried (1,2)(3) //输出结果都是6个科里奥利,把多元函数变成一元函数(几个自变量是几个函数,上面的getsum是三元函数)。Coriolis case用上面的curry方法实现了一个case:以字符串//面向过程的方式抽取所有数字,正则匹配' '。match(/\ D+/g)//Numbers//如果改成提取数组中带数字的元素,上面的方法就不行了,所以我们用Coritization把const _ = require(' lodash ')let match = _。curry (function (reg,Str) {return str.match(reg)})//让他有一个特定的函数let findStrNum = match(/\d+/g) //寻找数字Let findStrSpace = match(/\ S+/g)//寻找空格//Try console . log(findStrNum(' ASD 1234 ')//true console . log(findStrSpace(' ASD 1234 '))//false//OK,这里,就可以实现字符串的匹配了。//现在我们必须继续。从数组中提取包含数字的项。//数组需要循环。来一个corin thized filter let filter = function(FN,arr) {//FN这里是要操作的函数,返回arr.filter(fn) //这个filter是数组的过滤方法,不要混淆} let filter curry = _。Curry(Filter)//Corinize//让他拥有特定的功能,也就是说你可以传入上面定义的FindStorumlet Findarnum = Filter Curry(FindStornum)//Try console . log(Findarnum([' ABC 123 ',' abc'])。最后,我们用函数的方式实现了这个功能。我们这样写可能会觉得很麻烦,但是还是自己做常规写作比较好,但是你要清楚。 const _ = require(' lodash ')let match = _。curry(function (reg,str){ return str . match(reg)})let find strnum = match(/\ d+/g)let find strspace = match(/\ s+/g)let filter curry = _。curry(function (fn,Arr){ return Arr . filter(fn)})let findarnum = filter curry(find strnum)let findarspace = filter curry(find strspace)看看上面的东西。如果您定义了它们一次,您就可以在您的项目中无数次地重用它们。可以避免在自己的轮子里制造小bug来模拟_的实现。curry()//我们先来看看这个东西当时是怎么用的const _ = require ('lodash ')函数getsum (a,b,C) {return a+b+c} let curried = _。curry (getsum) curried(1,2,3) //其调用形式分为传入的统一参数,或者部分参数curried(1,2)(3) //实现函数curry(func){返回函数curredfn(...args){//判断实参和形参的个数if(args . length < func . length){ return function(){ return curredfn(...args . concat(array . from(arguments))//这是把每次的参数组合起来,用相同个数的参数和参数再次调用curriedFn}} //调用func,结果返回return func(...args)} } cori ization summary cori ization允许我们给一个函数传递更少的参数,得到一个记忆了一些固定参数的新函数。这是函数参数的一种‘缓存’,让函数更加灵活,让函数的粒度更小。多元函数可以转化为一元函数,一元函数可以组合使用,产生强大的函数。接下来将对函数的组合进行梳理,避免code化后出现类似洋葱圈的代码函数。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)
【技术支持|常见问题】你正确使用https了吗? [php源码](2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部