博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数式编程之Compose
阅读量:6371 次
发布时间:2019-06-23

本文共 1136 字,大约阅读时间需要 3 分钟。

Compose基本概念

顾名思义,在函数式编程中,Compose 就是将几个有特点的函数拼凑在一起, 让它们结合, 产生一个崭新的函数,如下就是组合

const compose = (f,g) => (...arg) => f(g(...arg))

f跟g在如上都是函数,...arg是在他们之间通过管道(pipe)传输的值

让我们来尝试使用一下组合

let toUpperCase = (x) => x.toUpperCase();let exclaim = (x) => x + '!';let shout = compose(toUpperCase,exclaim);shout('hello world')// HEELO WORLD !复制代码

pointfree 模式

pointfree模式指的是,永远不必说出你的数据,它的意思是指函数无须提及将要操作的数据是什么样的,一等公民的函数,curry 以及compose 协作起来非常有助于实现这种模式

// 非 pointfree, 因为提到了数据 wordlet snakeCase = (word) => word.toUpperCase().replace(/\s+/ig,'-');// pointfreelet snakeCase = compose(replace(/\s+/ig,'-'),toUpperCase)复制代码

pointfree 模式能够帮助我们减少不必要的命名,让代码保持简洁和通用。对函数式代码来说,pointfree 是非常好的石蕊试验,因为它能告诉我们一个函数是否是接受输入返回输出的小函数。

一些问题

回到楼上,我们可以看到上面的compose示例都只是传入了两个函数,因为我们的compose实现也只支持两个函数,那么如果我们想要支持一条很长很长的管道的时候,显然上面的compose就不够用了,下面我们可以来看看redux是如何实现compose的

// 摘自 https://github.com/reactjs/redux/blob/master/src/compose.jsexport default function compose(...funcs) {  if (funcs.length === 0) {    return arg => arg  }  if (funcs.length === 1) {    return funcs[0]  }  return funcs.reduce((a, b) => (...args) => a(b(...args)))}复制代码

代码很简洁,利用了数组的reduce方法来处理,就这样, 想拼多长就多长

转载地址:http://dcyqa.baihongyu.com/

你可能感兴趣的文章
第153天:关于HTML标签嵌套的问题详解
查看>>
可通过区块链实现去中心化的三大网络巨头
查看>>
vue-element-admin 4.0.1 发布,后台集成方案
查看>>
一位耶鲁教授,在和大公司比谁最快造出第一台量子计算机
查看>>
TMS云应邀参加第六届西部国际物流博览会
查看>>
(四)开源IT资产管理系统-->部署GLPI与OCS数据同步
查看>>
Hyper-V Server 第二代虚拟机
查看>>
Oracle Sys用户用默认密码change_on_install 无法登录的问题(错误代码:ORA-28009)
查看>>
DIFramework.NET ━ Web中打印的各种方案参考-欢迎补充
查看>>
HTML5 地理位置定位(HTML5 Geolocation)原理及应用
查看>>
RH436-6 Advanced RAID
查看>>
MOM2005安装配置指南
查看>>
HAProxy:基础详解
查看>>
MTCS标准
查看>>
英语每日听写练习 Day1
查看>>
如何让OWA可以查看SMTP/POP3/IMAP访问的设置
查看>>
dns详解
查看>>
Server 2003域控升级Server 2008R2或者Server 2012R2(上)
查看>>
初尝Mcafee之ePO端口修改【03】
查看>>
WDS--部署服务器
查看>>