您好!欢迎来到爱源码

爱源码

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

函数编程(3) [网站源码]

  • 时间:2022-10-14 13:11 编辑: 来源: 阅读:304
  • 扫一扫,手机访问
摘要:函数编程(3) [网站源码]
把纯函数和code化结合起来,很容易写出洋葱代码h(g(f(x))。例如,获取数组的最后一个元素,然后将其转换为大写字母。toUpper(。首先(_。反转(数组)))。别人维护的时候会一直看谁写的,想扇你一巴掌。写的正是时候,写完发现bug就头疼了。 既然你的洋葱圈不想被打,那么函数组合允许我们重新组合细粒度的函数,生成一个新的函数。 下图管道显示了程序中使用函数求解数据的过程。向fn函数输入参数A,返回结果b。 想象A数据通过管道得到B数据。 如果把绿色的长管道比作水管,如果有虫子漏了,就很难检查出来,所以我们明智的做法是把它切成几段,然后再把它们连接起来。也就是当fn函数比较复杂的时候,我们可以把fn函数拆分成几个小函数,此时中间运算过程产生的M和N比较多。 下图可以想象fn分为三条流水线f1,f2,f3,f3。数据A通过管道F3得到结果M,M通过管道f2得到结果N,N通过管道f1得到最终结果B。 //伪代码fn = compose(f1,f2,f3) //用一个compose把它们组合起来,形成原来的fnb = fn(a) //这个fn继续像以前一样使用组合函数compose:如果一个函数为了得到最终的值,必须用多个函数来求解,这时可以把中间进程的函数合并成一个函数function,就像一个数据管道。函数组合就是把这些管道连接起来,让数据通过多条管道,形成最终的结果。默认情况下,函数组合从右向左执行。所有的函数组合都是一元函数。我们简单的只组合两个函数来表示函数组合,得到数组的最后一项。//组合函数compose (f,G){ return Function(x){ return f(G(x))//洋葱圈是不可避免的,但是我们藏起来了} }//数组翻转函数Function reverse(arr){ return RR . reverse()}//函数first(arr){ return RR[0]}//Run let last = compose(first,reverse) last从右到左([1,2,3 4你说我用n个方法写,比这个简单,但是你要清楚我们写的这些辅助函数是可以任意组合调用的,所以函数式编程使既然Lodash中的组合函数如此常见,那么Lodash当然也提供了组合函数Lodash中的组合函数flow()或flowRight()。都可以组合多种功能。flow是指flow()从左向右运行。flowRight()从右向左运行,用的多一点。//取出数组中的最后一项,并将其大写。flowRight使用方法const _ = require(' lodash ')const toupper = s = >;s . toupper case()const reverse = arr = & gt;arr . reverse()const first = arr = & gt;arr[0]const f = _。flowRight(toUpper,first,reverse)console.log(f(['one ',' two ',Three']))实现flowRight//多功能组合函数flowRight(...fns){返回函数(值){返回fns。反转()。reduce (function (ACC,Fn) {//如果你对reduce不熟悉,去看看return fn(acc) },value) }}函数的组合——结合律函数的组合要满足结合律,这个结合律就是乘法结合律(1x2)x3 = 1x(2x3)//结合律let f = compose (f,g,H)let associative = compose(compose(f,g),h) = = compose (f,compose (g,H))// true所以我们上面的代码可以写const _ = require(' lodash ')//consts . toupper case()//const reverse = arr = & gt;arr . reverse()//const first = arr = & gt;Arr[0]//以上三个方法都是我们自己实现的纯函数,但是在lodash中都有。我们用lodash自带的吧。Const f = _。flowright (toupper,first,reverse) console.log (f (['one ',' two ',' three '])//下面三个是同一个常量f = _。flowright (_。图珀,_。第一,_。反向)//这里的lodash有什么好处const f = _。flowright (_。图珀,_。第一),_。反向)常数f = _。flowRight(_。图珀,_。flowRight(_。第一,_。reverse))console.log(f(['一','二','三'])//= & gt;三如何调试组合函数当我们的预期结果与实际结果不一致时,如何调试组合函数,发现bug?举这样一个例子,‘永不放弃’转换成‘永不放弃’const _ = require(' lodash ')//为什么下面三个一定要柯里化?因为split等等都需要两个参数,所以对于函数组合,我们需要一个一元函数const split。_.split(str,sep))const join = _。curry((sep,array)= & gt;_.join(array,sep))const map = _。库里((fn,array)= & gt;_.map (array,fn)) const f = _。flowright (join ('-'),map (_。tolower)、split('))console . log(f('永不放弃')//假设输出不是我们想要的,我们需要找出问题出在哪里。 //写一个跟踪函数,标签自己设置,标记哪个时间consttrace = _。库里((tag,v)= >;{console.log(tag,v) return v //需要返回的值}) const f = _。flowright(联接('-')、trace('映射后')、map (_。tolower)、trace('拆分后')、Split('))console . log(f('永不放弃'))lodash-fp模块从上面的例子我们可以看出_split、_。加入等。需要重新关联,太麻烦了,那么lodash提供了fp模块来处理这个问题。lodash的fp模块提供了一个对函数式编程友好的实用方法和一个auto-curied iterate-first data-last(自动科里化,函数优先,数据最后)//普通lodash模块的不可变方法,使用函数方法const _ = require ('lodash') _。映射(['a ',' b ',' c'],_。toupper)//可以看到数据在前,函数在后,这更符合传统的思维。/= >: ['A ',' B ',' C']// lodash/fp模块const fp = require(' LODASH/FP ')FP . map(FP . toupper)([' A ',' B ',' C']) //自动科里化,函数优先,函数优先C '])//这个也可以,但是没有意义fp.split('),Hello world ')FP . split(')(' Hello world ')现在我们用FP模块把上面的永不放弃constfp = require(')的例子转化“永不放弃”实际上是在这里学到的,我总是将常见的传统链式调用与函数组合编写方法进行比较。那时候我还记得接触JQuery时链式调用的行云流水的样子。我们来对比一下,链调用以数据为主语:一、吃()。睡眠()。Learn () compose以函数为主语。compose(学习,睡觉,吃饭)(一)比起compose的编写,更容易重用函数,数据保持稳定,不会被莫名其妙的修改。const ops = compose(...)ops(数据)。看看这篇文章。通过对比了解他们用react的同学是很好的。看他们现在是否熟悉,因为redux的源代码是用函数形式写的。不懂函数式编程的学生应该很难学会那些源代码。简而言之,这种函数式编程思维也是当前的趋势。最后再举一个例子,提取一个单词的首字母,转换成大写的‘hello web world’= >;’h-W-W ' const FP = require(' lodash/FP ')//const first lettertoupper = FP . flow right(FP . join(' . '))、fp.map(fp.first)、fp.map(fp.toUpper)、FP . split(')//以上,这里我们看到两次使用map都有一些重复。您可以使用flowRight组合函数const first letter tupper = FP . flow right(FP . join(' . '),fp.map (fp.flowright (fp.first,fp。Toupper))、FP。拆分(“”)控制台。log(firstlettertoupper(' hello web world '))然后重新组织下一个函子,解决反应、异常、异步等。


  • 全部评论(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
手机版
手机版
扫一扫进手机版
返回顶部