zoukankan      html  css  js  c++  java
  • [Ramda] Compose and Curry

    Curry:

    The idea of Curry is to spreate the data from the function. Using Curry to define the function logic and later pass the data into the function logic.

    Example1:

    const get = R.curry(function(prop, obj){
      return obj[prop];
    });
    
    const obj1 = {
      foo: 'bar'
    }
    console.log(get('foo')); //function (t){return n.apply(this,arguments)}
    console.log(get('foo')(obj1)); //bar

    The function 'get' just care about get the value from the object, doesn't care about what data it deal with. Make it more reuseable.

    Example 2:

    const ary1 = [
      {
        name: 'foo'
      },
      {
        name: 'bar'
      }
    ];
    const names = R.map(get('name'));
    console.log(names(ary1)); //["foo", "bar"]

    Combine different functions to make it more prowerful. Here we create a function called 'names',  later you pass in the data, it will return back the names for you.

    So far, you should think what 'curry' does is just define the function logic. For example, we wirte a 'Calculate average value' function.

    We can define the logic first: "1. We need sum value, 2. we need the size value, 3. Sum divide size":

    const nums = [15, 16, 5];
    const avgLogic = R.curry(function(divide, sum, size, nums){
      return divide( sum(nums), size(nums) );
    })
    const avgCal = avgLogic(R.divide, R.sum, R.length);
    const avgNum = avgCal(nums);
    console.log(avgNum);

    Compose:

    The idea of compose is to chain function together. R.compose run from 'rgiht' --> 'left'.

    So the previous result will be used for the next function. Those function combine together to make a more prowerful and reuseable function.

    const articles = [
      {
        title: 'Everything Sucks',
        url: 'http://do.wn/sucks.html',
        author: {
          name: 'Debbie Downer',
          email: 'debbie@do.wn',
          age: 42
        }
      },
      {
        title: 'If You Please',
        url: 'http://www.geocities.com/milq',
        author: {
          name: 'Caspar Milquetoast',
          email: 'hello@me.com',
          age: 34
        }
      }
    ];
    const ages = R.compose(
      R.map(get('age')),
      R.map(get('author'))
    );

    //OR
    const ages = R.map(
      R.compose(
        get('age'),
        get('author')
      )
    );
    console.log(ages(articles));
    // [42, 34]

    Exmaple 2:

    const words = "Hello world, what a great day!";
    const lengths = R.compose(
      R.map(R.length),
      R.split(' ')
    );
    console.log(lengths(words)); //[5, 6, 4, 1, 5, 4]

    Currently All the example2 list above using curry one way or another. The pattern is always like:

    var foo = bar('baz');
    var res = foo(data); // ... 
    
    //or
    var res = bar('baz')(data);

    The 'data' always come at the end,  but not necessary it should be like this every time.

    R.__ :  the placeholder for the curry data

    const lenSubTow = R.compose(
      R.map(R.subtract(R.__, 2)),
      R.map(R.length),
      R.split(' ')
    );
    console.log(lenSubTow(words)); //[3, 4, 2, -1, 3, 2]

    SO the result comes from 'R.map(R.length)' will be passed to 'R.__'.

  • 相关阅读:
    Android 11 的5个新安全和隐私功能,不更新会面临被黑客入侵风险
    SSL / TLS新加密漏洞,黑客是这样读取敏感数据,看看修复方法!
    蓝牙新漏洞,黑客可以轻松控制你的手机,全球数亿台设备受影响
    Visa信用卡漏洞,新的PIN验证黑客可绕过,并进行非接触式付款
    思科是如何遭黑客入侵?原因:XSS缺陷到RCE缺陷
    WhatsApp现神秘漏洞,黑客可远程查看聊天记录
    郭盛华:免受网络黑客攻击的5个技巧
    Apache服务器现3个致命漏洞,黑客可远程监听
    centos 下安装python3 的MySQLdb
    MySQL创建用户与授权及删除
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5832021.html
Copyright © 2011-2022 走看看