万物皆可柯里化的Ramda.js及传参详解

 更新时间:2022年07月08日 09:40:22   作者:掘金安东尼  
这篇文章主要为大家介绍了万物皆可柯里化的Ramda.js详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

我们前段时间写过好几篇关于 RxJS 的文章,RxJS api 操作符理解起来确实比较复杂,RxJS 是函数式编程中的 lodash 库,它消除了“时序”而带来的困扰,它核心思想是:函数式 + 响应式。

本篇, 要讲的不是 RxJS,而是另外一个函数式编程库 Ramda.js ,它同样也可以与 loadsh 对比理解,不过它的设计思路又不同了,它最大的特点是:所有函数都可以柯里化传参!以此来践行函数式编程思想。

往下看,后面我们就能明白:Ramda 所有 Api 都能柯里化的意义所在。

Function first,Data last

在 lodash 中,我们是这样写的,

var square = n => n * n;
_.map([4, 8], square)

参数在前,执行函数在后。

而在 Ramda 中,强调:函数在前,参数在后。

这样做有什么好处呢?

就是为了更好实现:柯里化。柯里化只需要参数一个一个的在后追加

var R = require('ramda');
R.map(square, [4, 8])
// 等同于
var R = require('ramda');
R.map(square)([4, 8])

再举个栗子:

var R = require('ramda');
const odd = x => x%2 === 1
const data = [3, 5, 6];
R.filter(odd, data); // [3, 5]
// 等同于
R.filter(odd)(data); // [3, 5]
// 也可以延迟调用
const filter1 = R.filter(odd);
// filter1 等待参数的传入
// 后续再传入 data
const filter2 = filter1(data)

如果不借用 Ramda.js , 需要自行实现柯里化,就会显得麻烦:

const _curry = f => a => b => f(a, b)
const odd = x => x%2 === 1
const _filter = _curry( (fn, arr) => arr.filter(fn) );
_filter(odd)([3,5,6]) // [3, 5]

Ramda 非常强调:R.api(fn, data) 这样的范式;

API

来看看 Ramda 有哪些神奇的、好用的、常用的 API~

  • map

map 让每个成员依次执行通过某个函数;

const double = x => x * 2;
R.map(double, [1, 2, 3]); //=> [2, 4, 6]
R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}
  • filter

用于过滤;

const isEven = n => n % 2 === 0;
R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]
R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
  • add

求和;

R.add(2, 3);       //=>  5
R.add(7)(10);      //=> 17
  • multiply

求积;

R.multiply(2)(5)  // 10
  • compose

函数组合,从右到左;

R.compose(Math.abs, R.add(1), R.multiply(2))(-4)
// |-4*2 + 1|,等于 7
  • pipe

函数组合,从左到右;

var negative = x => -1 * x;
var increaseOne = x => x + 1;
var f = R.pipe(Math.pow, negative, increaseOne)(3,4);
// -(3^4) + 1 ,等于 -80
  • curry

将多个参数转换为单个参数

const addFourNumbers = (a, b, c, d) => a + b + c + d;
const curriedAddFourNumbers = R.curry(addFourNumbers);
curriedAddFourNumbers(1, 2)(3)(4)

Ramda 还有其它丰富的 api,也可以结合 compose/pipe 自定义特定功能函数,用这些方法来简化程序,让代码变成函数式风格;

以上的例子都可在 jsrun.net/DTNKp/edit 可以在线运行测试;

更多 Ramda api 可见文档:ramda.cn/

以上就是万物皆可柯里化的Ramda.js详解的详细内容,更多关于柯里化Ramda.js的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript实现消息框示例

    JavaScript实现消息框示例

    这篇文章主要为大家详细介绍了JavaScript实现消息框示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • bootstrap fileinput完整实例分享

    bootstrap fileinput完整实例分享

    这篇文章主要为大家分享文件上传组件bootstrap fileinput完整实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 用javascript替换URL中的参数值示例代码

    用javascript替换URL中的参数值示例代码

    本篇文章主要是对用javascript替换URL中的参数值示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • JS中产生标识符方式的演变

    JS中产生标识符方式的演变

    本文记录下JS中产生标识符方式的演变,从ES5到ES6,ES5及其之前是一种方式,只包含两种声明(var/function),ES6则增加了一些产生标识符的关键字,如 let、const、class。
    2015-06-06
  • 基于JavaScript实现数值型坐标轴刻度计算算法(echarts的y轴刻度计算)

    基于JavaScript实现数值型坐标轴刻度计算算法(echarts的y轴刻度计算)

    这篇文章主要介绍了基于JavaScript实现数值型坐标轴刻度计算算法(echarts的y轴刻度计算),文章围绕主题展开详细的内容介绍,感兴趣的朋友可以参考与一下
    2022-06-06
  • 微信小程序的数据存储与Django等服务发送请求 讲解

    微信小程序的数据存储与Django等服务发送请求 讲解

    这篇文章主要为大家介绍了微信小程序的数据存储与Django等服务发送请求讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • JavaScript实现栈结构Stack过程详解

    JavaScript实现栈结构Stack过程详解

    这篇文章主要介绍了JavaScript实现栈结构Stack过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 简单的js计算器实现

    简单的js计算器实现

    这篇文章主要为大家详细介绍了如何实现简单js计算器的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 小程序新版订阅消息模板消息

    小程序新版订阅消息模板消息

    这篇文章主要介绍了小程序新版订阅消息模板消息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • javascript中获取元素标签中间的内容的实现方法

    javascript中获取元素标签中间的内容的实现方法

    下面小编就为大家带来一篇javascript中获取元素标签中间的内容的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论