<
>

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

2022-07-08 11:45:17 来源:易采站长站 作者:

目录
引言Function first,Data lastAPI

引言

我们前段时间写过好几篇关于>

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

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

Function>

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

var square = n =&gt; 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 =&gt; 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 =&gt; a =&gt; b =&gt; f(a, b)
const odd = x =&gt; x%2 === 1
const _filter = _curry( (fn, arr) =&gt; arr.filter(fn) );
_filter(odd)([3,5,6]) // [3, 5]

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

API

来看看>

    map

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

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

      用于过滤;

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

        求和;

        R.add(2, 3);       //=&gt;  5
        R.add(7)(10);      //=&gt; 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 =&gt; -1 * x;
              var increaseOne = x =&gt; x + 1;
              var f = R.pipe(Math.pow, negative, increaseOne)(3,4);
              // -(3^4) + 1 ,等于 -80
              
                curry

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

                const addFourNumbers = (a, b, c, d) =&gt; 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的资料请关注易采站长站其它相关文章!

暂时禁止评论

微信扫一扫

易采站长站微信账号